排除包含"x"的记录的正确模式匹配字符串是什么


DECLARE @data TABLE
(   sample_text VARCHAR(20))
DECLARE @match TABLE
(   match_text VARCHAR(20),
return_value INT
)
INSERT INTO @data
VALUES ('sample'),
('text'),
('fuzzy'),
('kittens')
INSERT INTO @match
VALUES ('%e%', 1),
('[^t]%', 2),
('%[^t]%', 3)
SELECT *
FROM @data  d 
JOIN @match m ON d.sample_text LIKE m.match_text

我试图根据字段中的数据是否与正则表达式匹配来返回一个值。

正则表达式应该使我能够在不必更改底层SQL的情况下匹配正(例如以T开头(和负(例如不以T开头的(。

简单的情况有效(例如包含"e",不以"t"开头(,但当我想返回不包含"t"的行时;t〃;我有个问题。

我知道我可以以任何方式使用NOT LIKE,但我正在寻找一个通用的解决方案。

只有返回值为3的行应该是"0";样品";以及";模糊"文本";以及";小猫";不应该匹配,因为它们每个都包含字符";t";。

在我的头脑中,CCD_;不包含字符"t";。在你的回答中,你能澄清一下它的真正含义吗?你能用同样的方式翻译你的建议以帮助我理解吗?

通过反转LIKE匹配的意义来排除记录,即:NOT LIKE

一般来说,任何包含NOT INNOT LIKE的查询在规模上都会表现得很糟糕,但这里有一种方法可以查找与给定模式不匹配的项。。。

DECLARE @data TABLE
(   sample_text VARCHAR(20))
DECLARE @match TABLE
(   match VARCHAR(20),
not_match VARCHAR(20),
return_value INT
)
INSERT INTO @data
VALUES ('sample'),
('text'),
('fuzzy'),
('kittens')
INSERT INTO @match
VALUES ('%e%', null, 1),
(null, 't%', 2),
(null, '%t%', 3)
SELECT *
FROM @data  d 
JOIN @match m
ON (m.match is not null and d.sample_text LIKE m.match)
OR (m.not_match is not null and d.sample_text NOT LIKE m.not_match);

如果它对任何人都有用。。。

和往常一样,实际问题比我们在这里发布的复制它的最小步骤稍微复杂一些。

我的特定场景涉及在4个单独的列上进行匹配,因此为每个现有列添加一个新列来表示NOT LIKE场景会使本已麻烦的解决方案变得更加麻烦

考虑到模式匹配不会让我做到这一点,我决定的解决方案是为LIKE场景和NOT LIKE场景设置单独的行,然后将它们分组在一起以获得结果。

DECLARE @data TABLE
(   sample_text VARCHAR(20))
DECLARE @match TABLE
(   rule_type    INT, -- 1 = Include, 0 = Exclude
match_text   VARCHAR(20),
return_value INT
)
INSERT INTO @data
VALUES ('sample' ),
('ample'  ),
('dimple' ),
('text'   ),
('fuzzy'  ),
('kittens')
INSERT INTO @match
VALUES ('1', '%mple%', 1),
('0', 'd%'    , 1),
('1', '[^t]%' , 2),
('0', '%mple%', 2)
SELECT sample_text, return_value
FROM @data  d 
JOIN @match m ON d.sample_text LIKE m.match_text
GROUP BY sample_text, return_value
HAVING MIN(rule_type) <> 0 -- any number of "include" rules can match but if any "exclude" rule is matched the record is not returned.

最新更新