Tsql 为什么T-SQL是;例如;运算符没有像我认为的那样计算这个表达式?

Tsql 为什么T-SQL是;例如;运算符没有像我认为的那样计算这个表达式?,tsql,syntax,sql-like,startswith,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 上面的示例打印的是[[55555 请注

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

请注意,@thing的原始值以括号“[”作为前缀。我希望IF条件返回false,因为“[5555555”类似于“[”+“%”

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

编辑 括号“[”似乎有一些特殊之处。当我像在括号上一样运行时,它不会达到我预期的效果,但当我不使用括号时,它会按照我预期的方式运行

查看以下示例:

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
以下是两个条件的输出:

这不像[

斯塔克和斯塔克一样


要使它工作,请将支票更改为

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

like不起作用的原因是,[是like中的一个特殊字符。就像%is一样。请参见

我相信这可能是因为“[”实际上是like运算符语法的一部分,定义如下:

您需要定义转义字符来转义[,如下所示:

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
DECLARE@thing-nvarchar(20)
设置@thing='[55555'
IF(LEFT(@thing,1)“[”)--如果值不是以[开头,则添加它
开始
设置@thing='['+@thing
结束
打印@thing
括号字符(
[
]
)。要搜索这些文字字符,您需要对这些字符进行转义(表示您要搜索这些文字字符,而不是将其用作通配符)。使用
转义
执行此操作,如下所示:

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

发件人:

您可以搜索包含一个或多个特殊通配符的字符串…要将百分号作为字符而不是通配符进行搜索,必须提供转义关键字和转义字符。例如,示例数据库包含一个名为
comment
的列,该列包含文本
30%
。若要在
comment
列的任何位置搜索包含字符串
30%
的任何行,请指定WHERE子句,例如
WHERE注释,如“%30!%%“ESCAPE”!”


您必须转义特殊字符(括号、单引号等)。在这种情况下,您可以执行以下操作:

LIKE '[['
编辑:


PS--[是一个特殊字符,因为它可以用于通配符,例如:
类似于“[0-9]”
进行模式匹配。(在这种情况下,匹配类似于正则表达式——0和9之间的任何数字。

如果使用
,有什么区别吗?)[%'
而不是带有连接的表单?没有。没有区别。实际上,在我第一次尝试时,我使用了您的版本。在尝试不同的语法时,我忘了将其移回og[%'发帖前。谢谢你的回答-你会注意到你们都有相同的原则性答案,因为我只能选择一个,所以我随机选择了汤姆。谢谢你的回答-你会注意到你们都有相同的原则性答案,因为我只能选择一个,所以我随机选择了汤姆。