SQL BETWEEN для текстовых и числовых значений

BETWEEN используется в предложении WHERE для выбора диапазона данных между двумя значениями.
Если я прав, исключается ли конечная точка диапазона или нет, это зависит от СУБД.
Что я не могу понять в следующем:
Если у меня есть таблица значений, и я делаю следующий запрос:

SELECT food_name 
    FROM health_foods 
    WHERE calories BETWEEN 33 AND 135;`  

Запрос возвращает строки результатов, включая калории =33 и калории =135 (т. е. конечные точки диапазона включаются).

Но если я сделаю:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'O';

Я не получаю строки с food_name, начинающиеся с O. т.е. конец диапазона исключается.
Чтобы запрос работал должным образом, я набираю:

SELECT food_name 
    FROM health_foods 
    WHERE food_name BETWEEN 'G' AND 'P';`   

Мой вопрос: почему такая разница для BETWEEN для чисел и текстовых данных?


person Cratylus    schedule 30.03.2013    source источник
comment
возможный дубликат предложения SQL Between со строковыми столбцами   -  person Kermit    schedule 30.03.2013


Ответы (3)


Между числами и символьными строками работает точно так же. Две конечные точки включены. Это часть стандарта ANSI, так работают все диалекты SQL.

Выражение:

where num between 33 and 135

будет соответствовать, если число равно 135. Оно не будет соответствовать, если число равно 135.00001.

Точно так же выражение:

where food_name BETWEEN 'G' AND 'O'

будет соответствовать 'O', но не любой другой строке, начинающейся с 'O'.

Один раз простой кладж — использовать «~». Это самое большое 7-битное значение ASCII, поэтому для англоязычных приложений оно обычно хорошо работает:

where food_name between 'G' and 'O~'

Вы также можете делать различные другие вещи. Вот две идеи:

where left(food_name, 1) between 'G' and 'O'
where food_name >= 'G' and food_name < 'P'

Однако важным моментом является то, что between работает одинаково независимо от типа данных.

person Gordon Linoff    schedule 30.03.2013

Возьмем пример «Оранжевый» против «О». Строка «Оранж» явно не равна строке «О», а так как она длиннее, то должна быть больше, а не меньше.

Вы можете сделать «Orange» ‹ «OZZZZZZZZZZZZZZ».

person SteveP    schedule 30.03.2013
comment
Я не понимаю вашего ответа. Что вы имеете в виду, что Orange не равно O?Orange начинается с O - person Cratylus; 30.03.2013
comment
Строка «Оранжевый» не совпадает со строкой «О», потому что в ней есть дополнительные символы, т.е. это дольше. Только «О» равно «О». - person SteveP; 30.03.2013
comment
@Cratylus Думайте об этом как о десятичных знаках, МЕЖДУ 33 И 135 вернет 135, но не 135,5. - person Igor Jerosimić; 30.03.2013

попробуй это с REGEX

  WHERE  food_name REGEXP '^[G-O]';

это дает вам все food_name, которые начинаются с G до тех, которые начинаются с O

ДЕМО ЗДЕСЬ

person echo_Me    schedule 30.03.2013