通配符 % 不能按预期工作

Wildcard symbol % does not work as expected

我在 SQL 服务器的一列中有一个字符串 table:

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%时,没有匹配。

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

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%'

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

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
             );

为什么我要使用像 "crazy" 这样的形容词(我实际上并不是字面的临床意义上的意思)?

  • 这样的比较不需要将整数转换为字符串。
  • 无需使用 XML 等功能进行此类比较。
  • EXISTS 应该是非常有效的,特别是在 ItemTags(itemId, tagId).
  • 上的索引
  • LIKE 根本不应该用于整数比较。