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

Оба из них работали, возвращая записи, содержащие "ожидающие" и "PENDING" соответственно. Таким образом, проблема связана с сопоставлением шаблонов LIKE claus.

Что я могу сделать, чтобы выполнить этот чувствительный к регистру поиск?

Ответ 1

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

Ответ 2

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

Обновление. Несмотря на то, что мой ответ выше, есть ошибка, связанная с Connect: Case-SENSITIVITY не работает при использовании диапазона, например, с COLLATE Latin1_General_CS_AS который Microsoft обозначил как "По дизайну".

Я проверил с помощью AdventureWorks2008R2 (без учета регистра, вне поля по умолчанию), в таблице Person.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 строки (это все последнее имя, оканчивающееся на 'n' и 'N')

Обновление: Благодаря @GeraldSv это работает:

SELECT COUNT(*)
FROM Person.Person
WHERE LastName LIKE '%[M-N]' COLLATE Latin1_General_BIN

Ответ 3

Я использую следующее:

SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS