SQL - игнорировать регистр при поиске строки


131


У меня есть следующие данные в таблице
PriceOrderShipped
PriceOrderShippedInbound
PriceOrderShippedOutbound

В SQL мне нужно написать запрос, который ищет строку в таблице. При поиске строки регистр следует игнорировать. Для указанного ниже SQL-запроса

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%PriceOrder%' 

дает все вышеперечисленные данные, тогда как

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '%Priceorder%' 

не дает.

Например. когда я ищу "PriceOrder" или "priceOrder", он работает, но "priceorder" или "Priceorder" не работает. Я попытался выполнить приведенный ниже запрос, используя COLLATE, но он не работает. Дай мне знать, где я ошибаюсь.

SELECT DISTINCT COL_NAME FROM myTable WHERE 
COL_NAME COLLATE latin1_general_cs LIKE '%Priceorder%'

Ответы:


234

Используйте что-то вроде этого -

SELECT DISTINCT COL_NAME FROM myTable WHERE UPPER(COL_NAME) LIKE UPPER('%PriceOrder%')

или

SELECT DISTINCT COL_NAME FROM myTable WHERE LOWER(COL_NAME) LIKE LOWER('%PriceOrder%')

14
Я считаю, что лучше всего всегда сравнивать строки, начинающиеся с заглавной буквы (UPPER). Google "turkish i"
Traubenfuchs

2
Хотите узнать, есть ли у вашего ответа какие-либо проблемы с производительностью, если преобразовать значение столбца в UPPERили LOWERрегистр, а затем использовать LIKEдля поиска?
Shaijut

На самом деле вам нужно будет сравнить варианты UPPER и LOWER, потому что некоторые символы имеют разные представления в верхнем регистре, но одинаковое представление в нижнем регистре. Для других персонажей может быть наоборот. Java упоминает грузинский алфавит специально как причину для выполнения дополнительной функции toLowerCase () в своем сравнении без учета регистра.
Crusha K. Rool

1
К сожалению, этот подход вызывает полное сканирование таблицы, как описано в этом сообщении: alvinalexander.com/sql/… . Поиск по индексу не может быть применен, так как отфильтрованный столбец изменяется функцией UPPER / LOWER.
Джефф С.

Установка сопоставления (перед созданием индекса) кажется лучшим подходом, если производительности запроса с верхним / нижним пределом недостаточно.
Джефф С.

10

См. Этот аналогичный вопрос и ответ на поиск с нечувствительностью к регистру - SQL-сервер игнорирует регистр в выражении where

Попробуйте использовать что-нибудь вроде:

SELECT DISTINCT COL_NAME 
FROM myTable 
WHERE COL_NAME COLLATE SQL_Latin1_General_CP1_CI_AS LIKE '%priceorder%'

это не работает, я получаю, что SQL-запрос не завершился должным образом перед сортировкой
shockwave

@ Miguel-F .. он работает нормально, но чем он отличается от SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME LIKE '% priceorder%', потому что это тоже отлично работает для меня ..
Джишант

Я бы посоветовал вместо этого использовать SQL_Latin1_General_Cp1_CI_AS_KI_WI. Это не так важно для поиска.
user8155123 07

10

Как это.

SELECT DISTINCT COL_NAME FROM myTable WHERE COL_NAME iLIKE '%Priceorder%'

В postgresql.


4
Этот вопрос помечен как sql-server, поэтому ответ postgres не актуален.
Лиам

4

Вероятно, вам следует использовать в SQL_Latin1_General_Cp1_CI_AS_KI_WIкачестве сортировки. Тот, который вы указываете в своем вопросе, явно чувствителен к регистру.

Вы можете увидеть список сопоставлений здесь .

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.