Ответ 1
Попробуйте использовать COLLATE Latin1_General_BIN
, а не COLLATE Latin1_General_CS_AS
Я пытаюсь найти записи, содержащие строку из 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.
Что я могу сделать, чтобы выполнить этот чувствительный к регистру поиск?
Попробуйте использовать 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;
Обновление. Несмотря на то, что мой ответ выше, есть ошибка, связанная с 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
Я использую следующее:
SELECT COUNT(*)
FROM Person.Person
WHERE LastName COLLATE Latin1_General_CS_AS != upper(LastName) COLLATE Latin1_General_CS_AS