微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决排除包含“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 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),'%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 举报,一经查实,本站将立刻删除。