Как вы выбираете, используя диапазон строк в SQL? - PullRequest
2 голосов
/ 03 февраля 2009

У меня есть таблица автомобилей с регистрационными номерами, и я хочу выбрать подмножество из них, которые находятся между некоторыми значениями «от» и «до», предоставленными пользователем.

Допустим, таблица выглядит так:

id       reg_num
1        DD1111
2        DD1112
3        DE2245
4        EE5678
5        EF6547

SQL, который у меня есть, выглядит так:

select *
from vehicles
where reg_num >= 'DD'   -- this value is user supplied
and reg_num <= 'DE'     -- and so is this one

Что должно (по моим мыслям) вернуть:

1        DD1111
2        DD1112
3        DE2245

Но вместо этого возвращается только:

1        DD1111
2        DD1112

Я полагаю, что SQL-сервер видит DE2245 больше, чем DE, и поэтому исключает строку.

Мой вопрос: как мне заставить сервер SQL включить все строки, начинающиеся с 'DE'?

Ответы [ 4 ]

8 голосов
/ 03 февраля 2009

Вы должны добавить 'zzzz's в конце столько, сколько необходимо, чтобы соответствовать определению ширины вашего столбца.

 select * from vehicles 
 where reg_num  >= 'DD' and reg_num <= 'DE' + 'ZZZZZZZZZZZZ'
5 голосов
/ 03 февраля 2009
where reg_num >= @userValueFrom 
and left(reg_num,char_length(@userValueTo) <= @userValueTo

но учтите, что здесь не используется какой-либо индекс из-за функции столбца в SARG.

1 голос
/ 03 февраля 2009

Если формат гарантирован, вы можете просто сделать:

SELECT *
FROM vehicles 
WHERE LEFT(reg_num, 2) BETWEEN 'DD' AND 'DE'

Но опять же, это, предположительно, не SARGable - что всегда сбивает меня с толку, потому что, конечно, можно использовать индекс reg_num ...

0 голосов
/ 24 марта 2017

DE2245 не меньше чем DE. Чтобы было понятнее, DE2245 меньше чем DE 3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...