Как я выполняю точное строковое совпадение на нечувствительном к регистру поле?

private static final Logger LOGGER = LoggerFactory.getLogger(AbstractDAProcedureMenuReceivedHandler.class);
7
задан Sam Saffron 22 November 2008 в 10:48
поделиться

2 ответа

Вот отрывок кода, который работает, его действительно хитрое, чтобы сделать это безопасным и эффективным способом. Двойное соответствие состоит в том, чтобы избежать сканирования таблицы (посмотрите на план выполнения). 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))
8
ответ дан 6 December 2019 в 19:43
поделиться

На самом деле я не вижу, почему необходимо сделать выход сначала, это встроено в SQL-сервер посредством СОПОСТАВЛЕНИЯ statment.

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
5
ответ дан 6 December 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: