Запрос Like не работает при использовании [или] в Like - PullRequest
2 голосов
/ 11 июля 2011

Нужно спросить о странном поведении SQL Server 2005.

Мне нужно найти записи, которые содержат ']' или '[' в моем столбце

У меня есть данные в столбце, как это

'6b51c65b-5773-415a-aec9-8482c404faef_megas_xlr[1].jpg'

Когда я запускаю этот запрос

select * from Theme  where BackgroundImageUrl like '%[%'

тогда никаких записей не появляется, но выполняется этот запрос ниже

select * from Theme  where BackgroundImageUrl like '%]%'

кипит после выхода

'6b51c65b-5773-415a-aec9-8482c404faef_megas_xlr[1].jpg'

Что не так в этом запросе? Что мне нужно сделать, чтобы искать записи с закрывающими или начальными скобками []?

EDIT ..

Для большей ясности, вот мои данные испытаний. А [1] .jpg B [1.jpg С1] .jpg * +1022 *

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

A select BackgroundImageUrl from Theme where BackgroundImageUrl like '%[%'

Нет результатов

B select BackgroundImageUrl from Theme where BackgroundImageUrl like '%]%'

* 1 033 * А [1] .jpg С1] .jpg * * тысяча тридцать четыре

С select BackgroundImageUrl from Theme where BackgroundImageUrl like '%[ [ ]%'

* * А одна тысяча тридцать восемь [1] .jpg B [1.jpg

D select BackgroundImageUrl from Theme where BackgroundImageUrl like '%[ ] ]%'

Нет результатов

Что мне нужно, так это, Случай 1: мне нужны все записи, которые содержат '['

Case2: мне нужны все записи, которые содержат ']'

Запрос C выполняет мой случай 1, но я не могу получить результат для моего случая 2

Ответы [ 5 ]

3 голосов
/ 11 июля 2011

[] являются явной частью поиска по шаблону:

Символ подстановки Описание Пример
% Любая строка из нуля или более символов.WHERE title LIKE «% computer%» находит все названия книг со словом «computer» в любом месте названия книги.

_ (подчеркивание) Любой отдельный символ.WHERE au_fname LIKE '_ean' находит все четырехбуквенные имена, заканчивающиеся на ean (Дин, Шон и т. Д.).

[] Любой отдельный символ в указанном диапазоне ([af]) или установить ([abcdef]).WHERE au_lname LIKE '[CP] arsen' находит фамилии автора, заканчивающиеся на arsen и начинающиеся с любого отдельного символа между C и P, например, Carsen, Larsen, Karsen и так далее.При поиске по диапазону символы, включенные в диапазон, могут различаться в зависимости от правил сортировки.

[^] Любой отдельный символ вне указанного диапазона ([^ af])или установить ([^ abcdef]).ГДЕ au_lname НРАВИТСЯ 'de [^ l]%' все фамилии авторов, начинающиеся с de, и где следующая буква не является l.

, вам нужно применить escape-предложение, чтобы SQL Server оценивал [] как то, что выищут:

match_expression [ NOT ] LIKE pattern [ ESCAPE escape_character ]  

* escape_character *
Символ, который ставится перед подстановочным знаком, чтобы указать, что подстановочный знак следует интерпретировать как обычный символ, а не как подстановочный знак.escape_character - это символьное выражение, которое не имеет значения по умолчанию и должно содержать не более одного символа.

или вы можете использовать: Использование подстановочных знаков в качестве литералов Вы можете использовать подстановочные знаки, соответствующие символам в качестве буквенных символов,Чтобы использовать подстановочный знак в качестве литерального символа, заключите подстановочный знак в скобки.В следующей таблице приведены несколько примеров использования ключевого слова LIKE и подстановочных знаков [].

Symbol           Meaning  
---------------  --------------------
LIKE '5[%]'      5%
LIKE '[_]n'      _n
LIKE '[a-cdf]'   a, b, c, d, or f
LIKE '[-acdf]'   -, a, c, d, or f
LIKE '[ [ ]'     [
LIKE ']'         ]
LIKE 'abc[_]d%'  abc_d and abc_de
LIKE 'abc[def]'  abcd, abce, and abcf
2 голосов
/ 11 июля 2011

Ну, я только что нашел свой ответ.

select * from Theme  where BackgroundImageUrl like  '%\]%' ESCAPE '\'

и

select * from Theme  where BackgroundImageUrl like  '%\[%' ESCAPE '\'
0 голосов
/ 11 июля 2011

Вы должны избежать открывающей скобки:

LIKE '%[[]% 

, но вам не нужно избегать закрывающей (как вы заметили)

Остальная часть "иногда" логикизависит от тебя.Или новый, полный вопрос.Мы ответили на это.

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

Отсюда: http://msdn.microsoft.com/en-us/library/ms179859.aspx

Получить строки, содержащие [или], как это.

declare @T table (S varchar(100))

insert into @T values ('A[1].jpg')
insert into @T values ('B[1.jpg')
insert into @T values ('C1].jpg')

select *
from @T
where S like '%[[]%' or
      S like '%]%'

Результат;

S
---------
A[1].jpg
B[1.jpg
C1].jpg
0 голосов
/ 11 июля 2011

LIKE (Transact-SQL)

[] используется для определения диапазонов в LIKE-предложении.

Документация, указанная выше, имеет следующее решение:

Использование подстановочных знаков в качестве литералов

Вы можете использовать символы подстановки, соответствующие символам в качестве литерала персонажи. Чтобы использовать подстановочный знак в качестве литерального символа, заключите подстановочный знак в скобки. Следующая таблица показывает несколько примеров использования ключевого слова LIKE и подстановочного знака [] символы.

Symbol       | Meaning
LIKE '[ [ ]' | [
LIKE ']'     | ]

Ваш запрос должен выглядеть следующим образом:

select * from Theme  where BackgroundImageUrl like '%[ [ ]%'

Редактировать : при условии, что вам нужны только файлы, которые имеют [ИЛИ a], но не оба:

select * from Theme  where (BackgroundImageURL like '%]%' AND BackgroundImageURL  not like '%[[]%')  or (BackgroundImageURL  like '%[[]%' AND BackgroundImageURL  not like '%]%') 
...