Предложение SQL Between со строковыми столбцами - PullRequest
18 голосов
/ 12 мая 2011

Я хочу сделать поиск, используя предложение «между» по строковому столбцу.Выполняя некоторый тест, я получил это:

Давайте предположим, что есть таблица стран со столбцом «name» типа varchar.Если я выполню этот запрос:

Select * from country where name between 'a' and 'b'

Я получу такой результат:

Argentina
.
.
.
Argelia.

Это исключает те страны, которые начинаются с буквы B, что я нахожу немного странным.

Есть ли способ сделать этот поиск более точным способом?Любые другие идеи для этого поиска?

Заранее спасибо

Ответы [ 6 ]

36 голосов
/ 12 мая 2011

Выражение

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 голосов
/ 09 августа 2011

Я думаю, я знаю, как решить вашу проблему.Вы можете попытаться добавить дополнительный символ в конец, как это

select * from tablea where column1 between 'ABC' and 'ACD'+'Z'

, это вернет результат от ABC% до ACE

1 голос
/ 12 мая 2011

Другой запрос, который получит страны, начинающиеся с b и A, будет:

Select * from country where name between 'a' and 'c'
1 голос
/ 12 мая 2011

Результат точный, но вы можете ошибаться. 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 использует индексы таблиц, поэтому вы получите полную производительность при использовании этого.

0 голосов
/ 16 августа 2011

Причина, по которой этот оператор не сработал, заключается в том, что SQL дополняет строку пробелами до тех пор, пока она не станет той же длины, что и сравниваемая строка. Так, для сравнения, sql сравнил b, а затем несколько пробелов с b******. Поскольку пробел появляется перед всеми остальными буквами, sql решил, что b***** следует после b[6 spaces]. Так что это не должно отображаться.

0 голосов
/ 12 мая 2011
Select * from country where substring(name FROM 1 FOR 1) between 'A' and 'B';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...