就像使用[或]中的查询不起作用一样

时间:2011-07-11 08:57:17

标签: sql sql-server-2005 search sql-like

需要询问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 ..

有关更多说明,请参阅我的测试数据。 A [1] .JPG B [1.JPG C1] .JPG

以下是我在运行以下组合后获得的结果

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

没有结果

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

A [1] .JPG C1] .JPG

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

A [1] .JPG B [1.JPG

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

没有结果

我需要的是, 案例1:我需要包含'['

的所有记录

案例2:我需要包含']'

的所有记录

查询C符合我的案例1,但我无法获得案例2的结果

5 个答案:

答案 0 :(得分:3)

[]是外卡搜索的明确部分:

通配符描述示例
 任何零个或多个字符的字符串。  标题LIKE'%computer%'在书名的任何地方找到所有带有'computer'一词的书名。

_ (下划线)  任何一个角色。  WHERE au_fname LIKE'_ean'找到以ean结尾的所有四个字母的名字(Dean,Sean等)。

[]  指定范围内的任何单个字符([a-f])或set([abcdef])。  WHERE au_lname LIKE'[C-P] arsen'找到以arsen结尾的作者姓氏,并以C和P之间的任何单个字符开头,例如Carsen,Larsen,Karsen等。在范围搜索中,范围中包含的字符可能会根据排序规则的排序规则而有所不同。

<强> [^]  任何不在指定范围内的单个字符([^ a-f])或set([^ abcdef])。  WHERE au_lname LIKE'de [^ l]%'所有作者姓氏以de开头,后面的字母不是l。

您需要应用一个转义子句让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

答案 1 :(得分:2)

我刚刚发现了答案。

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

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

答案 2 :(得分:0)

LIKE (Transact-SQL)

[]用于标识LIKE子句中的范围。

上面链接的文档有以下解决方案:

  

将通配符用作文字

     

您可以使用通配符模式匹配字符作为文字   字符。要将通配符用作文字字符,   将通配符括在括号中。下表显示   使用LIKE关键字和[]通配符的几个示例   字符。

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

您的查询必须如下所示:

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

修改:假设您只想要具有[或者]但不是两者的文件:

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

答案 3 :(得分:0)

从这里开始: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

答案 4 :(得分:0)

你必须逃离开场括号:

LIKE '%[[]% 

但是你不必逃避结束那个(如你所说)

剩下的“有时”逻辑取决于你。或者一个新的完整的问题。我们已经回答了这个问题。