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
ДЕМО ЗДЕСЬ