在SQL中。为什么带有通配符的“赞”语句不起作用?

时间:2018-07-19 18:29:04

标签: sql sql-server tsql

Declare @Temp1 as nvarchar(max) = '[10004120][1100][10033583][1005]'
Declare @Temp2 as nvarchar(max) = '[10004120][1100]'

If @Temp1 like @Temp2 + '%'
    Print 'Yup'

为什么这不起作用?我没有收到“ yup”消息。

4 个答案:

答案 0 :(得分:7)

这不起作用,因为字符串的括号在LIKE语句中具有特殊功能-括号之间的项构成一组与指定位置的单数字符匹配的值。您的原始模式将寻找1,0、4或2,然后是1或0。要使其正常工作,您应该具有以下模式:

Declare @Temp2 as nvarchar(max) = '[[]10004120][[]1100]'

答案 1 :(得分:2)

您的like向后。模式是 second 操作数。逻辑应该是:

 @temp1 like @temp2 + '%'

答案 2 :(得分:2)

至少在MS Sql Server中,方括号在LIKE中具有含义。
它们有点类似于正则表达式中的字符类。

例如:

WHERE col LIKE '[0-9]%'将找到以数字开头的col值。
WHERE col LIKE '%[^0-9]'将找到以数字结尾的col值。

因此,LIKE '[10004120][1100]%'等同于LIKE '[0-24][01]%',实际上将与诸如'11X','40Y'之类的字符串匹配。

但是在这种情况下,您不必使用LIKE。
因为第一个字符串只需要以第二个字符串开头即可。

IF @Temp2 = LEFT(@Temp1, LEN(@Temp2))
PRINT 'yup'

并检查第二个字符串是否是第一个字符串的一部分。
您可以使用CHARINDEX。如果一开始就发现它会返回1。

IF CHARINDEX(@Temp2, @Temp1) > 0
BEGIN 
   PRINT 'yup'
END

答案 3 :(得分:2)

我不会在括号中添加the optional ESCAPE clause,而不是在方括号中添加特定的模式:

Declare @Temp1 as nvarchar(max) = '[10004120][1100][10033583][1005]'
Declare @Temp2 as nvarchar(max) = '[10004120][1100]'

If @Temp1 LIKE REPLACE(@Temp2, '[', '\[') + '%' ESCAPE '\'
    Print 'Yup'

对我来说,您要完成的工作更加简洁明了。显然,您必须选择一个保证不在数据中的转义符,否则必须先使用@Temp1 LIKE REPLACE(REPLACE(@Temp2, '\', '\\'), '[', '\[') + '%' ESCAPE '\'来转义嵌入的转义符。