Как выполнить точное совпадение строк в не чувствительном к регистру поле? - PullRequest
7 голосов
/ 21 ноября 2008

Я хотел бы найти все строки в таблице и сопоставить их с точной строкой. К сожалению, в моей таблице сопоставление регистров не учитывается.

Какой самый эффективный способ выполнить это.

Например.

Я бы хотел, чтобы следующие строки не возвращали:

select * from sysobject where name = 'Sysbinobjs' 

Для ответа предположим, что @match находится в переменной:

declare @match varchar(4000) 
set @match = 'sysbinobjs'

РЕДАКТИРОВАТЬ

Уточнение, убедитесь, что конечные пробелы обрабатываются правильно, я хочу точное совпадение, которое учитывает конечные пробелы, поэтому «Hello» будет соответствовать только «Hello», а не «Hello»

Ответы [ 2 ]

7 голосов
/ 21 ноября 2008

Вот фрагмент кода, который работает, действительно сложно сделать это безопасным и эффективным способом. Двойное совпадение, чтобы избежать сканирования таблицы (посмотрите на план выполнения). Varbinary приведёт к совпадению длины и регистра. Таким образом, задние пробелы обрабатываются правильно, а корпус обрабатывается должным образом.

Примечание сравниваемый тип должен быть идентичен типу в таблице для приведения типов в varbinary (например, имя в sysobject является nvarchar, поэтому @match должен быть nvarchar) .

declare @match nvarchar(4000) 
set @match = 'sysbinobjs'


select * from sysobjects
where name = @match and
cast(name as varbinary(4000)) = cast(@match as varbinary(4000))
5 голосов
/ 21 ноября 2008

На самом деле я не понимаю, почему сначала нужно выполнить экранирование, это встроено в SQL-сервер с помощью инструкции COLLATE.

select * from sysobjects
WHERE name = @match and --Get all relevant hits from the index before doing the final case sensitive test
name COLLATE Latin1_General_CS_AS = @match COLLATE Latin1_General_CS_AS
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...