SQL Между предложением со строками столбцов
Я хочу выполнить поиск, используя предложение "между" над столбцом строки. Выполняя некоторые тесты, я получил следующее:
Предположим, что существует таблица стран с столбцом "name" типа varchar. Если я выполню этот запрос:
Select * from country where name between 'a' and 'b'
Я получил этот результат:
Argentina
.
.
.
Argelia.
Это исключает те страны, которые начинаются с буквы B, которую я нашел немного странно.
Есть ли способ сделать этот поиск более точным способом? Любые другие идеи для этого поиска?
Заранее спасибо
Ответы
Ответ 1
Выражение
name between 'A' and 'B'
эквивалентно
name>='A' and name<='B'
Итак, "Аргентина" >= 'A' и <= 'B', и она удовлетворяет условию. Но "Боливия" не равна <= 'B'. 'Боливия' > 'B'. Он не просто смотрит на первую букву: она смотрит на всю строку. Это, безусловно, так, как должно быть: если бы этого не делалось, не было бы способа сказать, что вам нужен диапазон, включающий "Смит", но не "Смитерс".
Чтобы выполнить то, что вы хотите, вы могли бы сказать:
substr(name,1,1) between 'A' and 'B'
или
name like 'A%' or name like 'B%'
или
name>='A' and name<'C'
Ответ 2
Думаю, я знаю, как решить вашу проблему. u можете попробовать добавить лишний символ в спину, подобный этому
select * from tablea where column1 between 'ABC' and 'ACD'+'Z'
это вернет результат от ABC% до ACE
Ответ 3
Результат точный, но вы можете быть недопониманием. x between a and b
означает x>=a and x<=b
. (Подробнее см. Документация PostGRES)
Если вы хотите получить строки, начинающиеся с a
или b
, скажите, что вы имеете в виду:
select * from country where name like 'a%' or name like 'b%'
like
использует индексы таблицы, чтобы получить полную производительность для использования.
Ответ 4
Другим запросом, который получит страны, начинающие с буквы b, а также A, будет:
Select * from country where name between 'a' and 'c'
Ответ 5
Select * from country where substring(name FROM 1 FOR 1) between 'A' and 'B';
Ответ 6
Причина, по которой этот оператор не работает, - это SQL-прокладка строки с пробелом до тех пор, пока она не будет иметь ту же длину, что и строка сравнения. Итак, для сравнения, sql сравнивает b
, за которым следуют несколько пробелов с b******
. Поскольку пробелы появляются перед всеми другими буквами, sql решил b*****
после b[6 spaces]
. Поэтому он не должен отображаться.