Как выполнить поиск с учетом регистра, используя LIKE?
Я пытаюсь найти записи, содержащие строку из 6 или более буквенно-цифровые символы в верхнем регистре. Некоторые примеры:
PENDING 3RDPARTY CODE27
Я использую следующее заявление:
SELECT Details
FROM MyTable
WHERE Details LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%';
этот запрос возвращает все записи, содержащие 6 или более букв, независимо от регистра.
я добавил COLLATE
о себе:
SELECT Details
FROM MyTable
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%';
это ничего не меняет. Он по-прежнему возвращает записи с 6-или-более-буквенным словом, независимо от случай.
просто в качестве теста, я пробовал:
SELECT Details
FROM MyTable
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%pending%';
SELECT Details
FROM MyTable
WHERE Details COLLATE Latin1_General_CS_AS LIKE '%PENDING%';
оба они работали, возвращая записи, содержащие" ожидающие "и" ожидающие " соответственно. Таким образом, проблема, похоже,LIKE
соответствие рисунка Клауса.
что я могу сделать, чтобы выполнить этот поиск с учетом регистра?
3 ответов
обновление из-за @GeraldSv: используйте параметры сортировки Latin1_General_BIN
SELECT Details
FROM MyTable
WHERE Details
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'
COLLATE Latin1_General_BIN;
вам нужно разместить спецификатор сортировки после строка, которая должна быть сопоставлена, а не столбец:
SELECT Details
FROM MyTable
WHERE Details
LIKE '%[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]%'
COLLATE Latin1_General_CS_AS;
Update: хотя мой ответ выше правильный, есть ошибка, поданная при подключении:чувствительность к регистру не работает при использовании диапазона в like с COLLATE Latin1_General_CS_AS которые Microsoft пометили как "по дизайну".
I проверено с помощью AdventureWorks2008R2 (без учета регистра, из коробки по умолчанию), в человеке.Таблица Person я изменил 3 фамилии, заканчивающиеся на " n " на "N", а затем выполнил следующие запросы:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%N' COLLATE Latin1_General_CS_AS
успехов. Возвращает 3 строки, как ожидалось.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N]' COLLATE Latin1_General_CS_AS
успехов. Возвращает 3 строки, как ожидалось.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[N-N]' COLLATE Latin1_General_CS_AS
успехов. Возвращает 3 строки, как ожидалось.
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_CS_AS
не удается. Возвращает 3334 строки (которые все Lastname заканчивается на 'n' и 'N')
обновление: благодаря @GeraldSv это работает:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_BIN
Я использую следующий:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS