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 для чисел и текстовых данных?

Ответ 1

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

Выражение:

where num between 33 and 135

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

Аналогично, выражение:

where food_name BETWEEN 'G' AND 'O'

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

Как только простой kludge должен использовать "~". Это имеет наибольшее 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 работает одинаково независимо от типа данных.

Ответ 2

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

Вы можете сделать "Оранжевый" < 'OZZZZZZZZZZZZZZ', хотя.

Ответ 3

попробуйте сделать это с помощью REGEX

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

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

ДЕМО ЗДЕСЬ