匹配不包含特定子模式的模式

问题描述 投票:0回答:2

我想查找与给定文本模式匹配但模式的一部分与特定值不同的记录。例如,

Page
表的记录可能具有
PageId
字段和
Description
文本字段,如下所示:

PageId: 3718
Description: Page 3718 contains... Page 3718 contains...

我知道我可以构建一个 LIKE 条件来匹配

PageId
:

Description LIKE '%Page ' + CAST(P.PageId as varchar(8)) + ' contains%'

但我想要的却恰恰相反。我想查找

Description
字段中至少有一个页面 ID 与实际
PageId
值不匹配的记录。这将使我能够检测如下记录:

PageId: 3718
Description: Page 4092 contains... Page 3718 contains...

我知道如何在代码中使用正则表达式来做到这一点,但是我如何在 SQL 中做到这一点?

sql sql-server sql-like
2个回答
2
投票

你可以使用类似的东西:

REPLACE(x, 'Page ' + CAST(PageId as varchar(8)) + ' contains', '') LIKE '%Page%contains%'

尝试匹配奇数字符串。

请注意,这将与“页面包含”模式之外包含单词“包含”的字符串匹配太多。


1
投票

举个例子...

CREATE TABLE SQL_Server_Query
(PageId INT PRIMARY KEY,
 "Description" VARCHAR(max));

INSERT INTO SQL_Server_Query VALUES
(3718, 'Page 3718 contains... Page 3718 contains...: Page 3718 contains... Page 3718 contains...'),
(3719, 'Page 4092 contains... Page 3719 contains...');

查询可以是:

SELECT PageId
FROM   SQL_Server_Query 
       CROSS APPLY STRING_SPLIT(REPLACE("Description", 'Page ', CHAR(0)), CHAR(0))
WHERE  value NOT LIKE CAST(PageId AS VARCHAR(32)) + '%'
  AND  value <> ''
© www.soinside.com 2019 - 2024. All rights reserved.