Declare @Temp1 as nvarchar(max) = '[10004120][1100][10033583][1005]'
Declare @Temp2 as nvarchar(max) = '[10004120][1100]'
If @Temp1 like @Temp2 + '%'
Print 'Yup'
为什么这不起作用?我没有收到“ yup”消息。
答案 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 '\'
来转义嵌入的转义符。