我试图通过确保变量的值以括号“[”为前缀来错误地捕获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?并且,更重要的是,我想,检查在变量字符串值的开头是否存在字符串的正确语法是什么?
修改 看来,括号“[”有一些特殊之处。当我在支架上运行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
答案 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)
答案 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之间的任何数字。