Почему оператор «LIKE» в T-SQL не оценивает это выражение так, как мне кажется? - PullRequest
6 голосов
/ 23 июля 2011

Я пытаюсь перехватить имя переменной T-SQL, убедившись, что перед значением переменной стоит скобка "[".

Вот пример того, как я пытаюсь это сделать:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
IF(@thing NOT LIKE '[' + '%') --If the value does not start with [ then add it
BEGIN
SET @thing = '[' + @thing
END
PRINT @thing

Пример выше PRINT's [[55555

Обратите внимание, что исходное значение @thing было дополнено скобкой "[". Я ожидал, что условие ЕСЛИ вернуло бы false, так как "[55555" is LIKE '[' + '%'

Почему условие IF не возвращает false? И, что более важно, я полагаю, каков правильный синтаксис для проверки существования строки, которая возникает в начале значения переменной строки?

EDIT Похоже, что в скобках "[" есть что-то особенное. Когда я запускаю LIKE на брекете, он не выполняет то, что я ожидаю, но когда я не использую брекет, LIKE работает так, как я ожидаю.

Посмотрите эти примеры:

IF('[' NOT LIKE '[')
BEGIN
PRINT '[ is NOT LIKE ['
END
ELSE
BEGIN
PRINT '[ is LIKE ['
END

IF('StackO' NOT LIKE 'StackO')
BEGIN
PRINT 'STACKO is NOT LIKE StackO'
END
ELSE
BEGIN
PRINT 'STACKO is LIKE StackO'
END

Вот вывод двух условий:

[НЕ НРАВИТСЯ [

STACKO, как StackO

Ответы [ 4 ]

5 голосов
/ 23 июля 2011

Я полагаю, что это может быть потому, что '[' на самом деле является частью синтаксиса операторов LIKE, как определено здесь: http://msdn.microsoft.com/en-us/library/ms179859.aspx

Вам необходимо определить escape-символ для экранирования [, например:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
IF(@thing NOT LIKE '\[%' ESCAPE '\' )
BEGIN
SET @thing = '[' + @thing
END
PRINT @thing

Альтернативное решение будет следующим:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
IF(LEFT(@thing,1) <> '[') --If the value does not start with [ then add it
BEGIN
SET @thing = '[' + @thing
END
PRINT @thing
2 голосов
/ 23 июля 2011

Символы в скобках ([ и ]) - это специальные символы подстановки в T-SQL .Для поиска этих буквенных символов вам нужно экранировать эти символы (укажите, что вы хотите искать эти буквальные символы, а не использовать их в качестве подстановочных знаков).Для этого используйте ESCAPE, например:

DECLARE @thing nvarchar(20)
SET @thing = '[55555'
-- pick an escape character you won't see in your content
IF(@thing NOT LIKE '![' + '%' ESCAPE '!')
BEGIN
  SET @thing = '[' + @thing
END
PRINT @thing

Это печатает [55555.

От MSDN :

Вы можете искать строки символов, которые содержат один или несколько специальных символов подстановки ... Чтобы искать знак процента как символ, а не как символ подстановки, необходимо указать ключевое слово ESCAPE и escape-символ.Например, пример базы данных содержит столбец с именем comment, содержащий текст 30%.Чтобы найти строки, содержащие строку 30% в любом месте столбца comment, укажите предложение WHERE, например WHERE comment LIKE '%30!%%' ESCAPE '!'.

.
2 голосов
/ 23 июля 2011

Чтобы он заработал, измените чек на

IF (SUBSTRING(@thing, 1,1) != '[')

Причина, по которой подобное не работает, заключается в том, что [это специальный символ в like.так же, как%.Смотри здесь

0 голосов
/ 23 июля 2011

Вы должны экранировать специальные символы (скобки, одинарные кавычки и т. Д.). В этом случае вы можете сделать это:

LIKE '[['

EDIT:

PS - [это специальный символ, потому что его можно использовать для подстановочных знаков, например: LIKE '[0-9]' для сопоставления с образцом. (В этом случае совпадение похоже на регулярное выражение - любая цифра от 0 до 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...