SQL - Ігноруйте випадок під час пошуку рядка


130


У таблиці
наведені нижче дані 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%'

Відповіді:


232

Використовуйте щось подібне -

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

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

1
На жаль, такий підхід викликає повне сканування таблиці, як описано в цій публікації: alvinalexander.com/sql/… . Пошук по індексу не можна застосовувати, оскільки відфільтрований стовпчик модифікується функцією UPPER / LOWER.
Джефф С.

Встановлення зіставлення (до створення індексу) здається кращим підходом, якщо ефективність запитів із верхньою / нижньою недостатнім.
Джефф С.

10

Дивіться подібний запитання та відповідь на пошук із нечутливістю до регістру - SQL-сервер ігнорує випадок у виразі a

Спробуйте використовувати щось на кшталт:

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

це не працює, я отримую запит SQL належним чином не закінчився перед Collate
shockwave

@ Miguel-F .. він працює добре, але чим він відрізняється від SELECT DISTINCT COL_NAME від myTable, де COL_NAME МЕЖАЄТЕ «% priceorder%», тому що це також добре працює для мене ..
Jishant

Я б порадив використовувати замість 'SQL_Latin1_General_Cp1_CI_AS_KI_WI'. Це не розумно для сенсі.
користувач8155123

8

Подобається це.

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

У postgresql.


4
Це питання позначено тегом sql-сервера, тому відповідь на постгреси не відповідає.
Ліам

4

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

Перелік посилань можна переглянути тут .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.