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]. Поэтому он не должен отображаться.