Как выполнить поиск с учетом регистра, используя 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 ответов


попробуйте использовать COLLATE Latin1_General_BIN, а не COLLATE Latin1_General_CS_AS


обновление из-за @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