MS-SQL和特定的LIKE子句

时间:2014-03-06 10:42:24

标签: sql sql-server regex

我有一个表,其中名为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 88NOT 28 or 82

2 个答案:

答案 0 :(得分:1)

正如您所说,您的模式不符合您的要求。 [11|01]并不代表1101,而是指01|

的单个字符

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

这是你在找什么?