通配符 % 不能按预期工作
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
根本不应该用于整数比较。
我在 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
根本不应该用于整数比较。