为什么T-SQL“LIKE”运算符不像我认为的那样评估这个表达式?

时间:2011-07-22 23:32:42

标签: tsql syntax sql-like startswith

我试图通过确保变量的值以括号“[”为前缀来错误地捕获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的[[55555

示例

请注意,@ thing的原始值以括号“[”为前缀。我期待自"[55555" is LIKE '[' + '%'

以来IF条件返回false

为什么IF条件不返回false?并且,更重要的是,我想,检查在变量字符串值的开头是否存在字符串的正确语法是什么?

修改 看来,括号“[”有一些特殊之处。当我在支架上运行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 个答案:

答案 0 :(得分:5)

我认为这可能是因为'['实际上是LIKE运算符语法的一部分,如此处所定义:http://msdn.microsoft.com/en-us/library/ms179859.aspx

你需要定义一个转义符来逃避[,像这样:

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

答案 1 :(得分:2)

要使其正常运行,请将支票更改为

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

喜欢不工作的原因是因为[是一个特殊的焦点。就像%是。见here

答案 2 :(得分:2)

括号字符([]are special wildcard characters in 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关键字和转义字符。例如,示例数据库包含一个名为comment的列,其中包含文本30%。要在30%列中的任何位置搜索包含字符串comment的任何行,请指定WHERE子句,例如WHERE comment LIKE '%30!%%' ESCAPE '!'

答案 3 :(得分:0)

您必须转义特殊字符(括号,单引号等)。在这种情况下,您可以这样做:

LIKE '[['

编辑:

PS - [是一个特殊字符,因为它可用于通配符,如:LIKE '[0-9]'进行模式匹配。 (在这种情况下,匹配就像一个正则表达式 - 0到9之间的任何数字。