如何解决排除包含“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
我正在尝试根据字段中的数据是否与正则表达式匹配来返回一个值。
正则表达式应该使我能够匹配正数(例如以 T 开头)和负数(例如不以 T 开头)而无需更改底层 sql。
简单的情况下工作(例如包含“e”,不以“t”开头),但是当我想返回不包含“t”的行时,我遇到了问题。
我知道我可以通过多种方式使用 NOT LIKE
,但我正在寻找通用的解决方案。
返回值为 3 的唯一行应该是“sample”和“fuzzy”。 “text”和“kittens”不应该匹配,因为它们都包含字符“t”。
在我的脑海中,"%[^t]%"
的意思是“不包含字符 't'”。在您的回答中,您能否澄清它的真正含义?你能用同样的方式翻译你的建议以帮助我理解吗?
解决方法
您通过反转 LIKE
匹配的含义来排除记录,即:NOT LIKE
。
作为一般规则,任何包含 NOT IN
或 NOT 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),'%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%',('0','d%',('1','[^t]%',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.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。