我有一个表,其中名为PATTERN
的一列中存储了模式,例如:[11|01][22|88]333[4|0]
。现在我想创建一个类似于此的查询:
SELECT mt.id
FROM dbo.MyTable mt
WHERE '11223334' LIKE mt.PATTERN
我知道我的模式不正确并且不起作用,但我也想知道是否可以创建查询,其中部分[22|88]
(两位数或另外两位数)将起作用。这是最重要的问题。
另一个问题是,如果将这些模式存储在数据库中是一个很好的解决方案,尤其是 - 以这种方式进行比较(请注意,与多个模式相比,它是一个字符串,而不是一个模式与多个字符串相比)。 / p>
更新
换句话说 - 我正在寻找一个LIKE查询,它会查找超过一位数的值,即LIKE '[22|88]'
应该查找值22 or 88
,NOT 28 or 82
。
答案 0 :(得分:1)
正如您所说,您的模式不符合您的要求。 [11|01]
并不代表11
或01
,而是指0
,1
或|
e.g。
SELECT *
FROM (VALUES ('0'), ('1'), ('|')) t (Col)
WHERE Col LIKE '[11|01]';
将返回所有3个值。实际上,您需要定义模式[11|01][22|88]333[4|0]
,逻辑要复杂得多。它将是:
SELECT *
FROM (VALUES
('11223334'), -- MATCH
('11223335'), -- NO MATCH AT -------5 (NOT 0 OR 4)
('11283334'), -- NO MATCH AT --28---- (NOT 22 OR 88)
('01223334') -- MATCH
) t (Col)
WHERE Col LIKE '[01]1______'
AND (Col LIKE '__22____' OR Col LIKE '__88____')
AND Col LIKE '____333_'
AND Col LIKE '_______[04]';
因此,我不认为您可以单独使用SQL Server模式匹配来实现您的目标。您可能需要使用clr user defined function to implement regex
如果符合您的要求,我认为以这种方式存储您的模式没有任何问题。
答案 1 :(得分:0)
不确定使用的模式是什么,但查询将是
SELECT mt.id
FROM dbo.MyTable mt
WHERE mt.PATTERN like '%[22|88]%'
这是你在找什么?