通配符%无法正常工作

时间:2019-08-18 00:56:47

标签: sql sql-server regex wildcard

我在SQL Server表的列中有一个字符串:

30,36,40,41,42,52,62,63,66,67,76

如您所见,此字符串的编号为62和66。

我正在使用此正则表达式来匹配此字符串:

%62%76%

但是它与该字符串不匹配。

如何更改此正则表达式以匹配提到的字符串?

SQL代码的一部分:

WHERE 
    (SELECT STUFF((SELECT ',' + CONVERT(NVARCHAR(MAX), TagID)
                   FROM ItemTag
                   WHERE ItemID = nt.ItemID
                   FOR XML PATH('')), 1, 1, '') AS tags) LIKE '%62%76%'

非常奇怪,但是当我使用%30%52%时,它匹配字符串,但是当我使用%30%62%时,没有匹配项。

2 个答案:

答案 0 :(得分:2)

您需要指定ORDER BY TagID,以确保根据LIKE表达式的需要对TagID值进行排序:

WHERE (SELECT STUFF(
  (
    SELECT ',' + CONVERT(NVARCHAR(MAX), TagID)
    FROM ItemTag
    WHERE ItemID = nt.ItemID
    ORDER BY TagID
    FOR XML PATH('')
  ), 1, 1, '') as tags
) LIKE '%62%76%'

答案 1 :(得分:1)

这似乎是一种疯狂的方法,试图查看集合中是否有两个值。相反:

where exists (select 1
              from ItemTags it
              where it.ItemId = nt.ItemId and
                    it.tagid = 62
             ) and
      exists (select 1
              from ItemTags it
              where it.ItemId = nt.ItemId and
                    it.tagid = 76
             );

我为什么要使用“疯狂”之类的形容词(实际上从临床意义上讲,这并不是我的意思)?

  • 进行这种比较无需将整数转换为字符串。
  • 进行这种比较无需使用XML之类的功能。
  • EXISTS应该非常有效,尤其是在ItemTags(itemId, tagId)上具有索引的情况下。
  • LIKE根本不应该用于整数比较。