SQL Server 匹配 2 个表列以实现完全单词匹配



我想在一个表的 varchar 列中搜索另一个表的 varchar 列中的内容。

某些单词被禁止,我想识别具有禁止单词的行。我想要与禁止的单词完全匹配。

我正在使用MS SQL Server 2016。

表 1:

CREATE TABLE [dbo].[BlogComment](
[BlogCommentId] [int] IDENTITY(1,1) NOT NULL,
[BlogCommentContent] [varchar](max) NOT NULL,
CONSTRAINT [PK_BlogComment] PRIMARY KEY CLUSTERED 
(
[BlogCommentId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = 
ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]

3 行 - 以及 BlogCommentContent 中的数据:

我们有很多人。

这就是男人。

我听你的。

表 2:

CREATE TABLE [dbo].[BannedWords](
[BannedWordsId] [int] IDENTITY(1,1) NOT NULL,
[Description] [varchar](250) NOT NULL
CONSTRAINT [PK_BannedWords] PRIMARY KEY CLUSTERED 
(
[BannedWordsId] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = 
ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]

3 行 - 以及描述中的数据:

虽然

男人

听见


My Sql:

SELECT BlogCommentContent
FROM dbo.BlogComment,
dbo.BannedWords
WHERE ( CHARINDEX( [Description], BlogCommentContent, 1 ) ) > 1

它在"许多"这个词中找到"人"、"听"和"人"。 所以它返回 3 行。

我只想要完全匹配。 所以只返回 2 行。

我该如何实现此目的?

请尝试以下解决方案。

它将从SQL Server 2017开始工作。

.SQL

-- DDL and sample data population, start
DECLARE @BlogComment TABLE (
BlogCommentId INT IDENTITY PRIMARY KEY,
BlogCommentContent VARCHAR(MAX));
INSERT INTO @BlogComment (BlogCommentContent) VALUES
('There are many of us.'),
('This is the man.'),
('I hear you.');
DECLARE @BannedWords TABLE (
BannedWordsId INT IDENTITY PRIMARY KEY,
Word varchar(250))
INSERT INTO @BannedWords (Word) VALUES
('though'),
('man'),
('hear');
-- DDL and sample data population, end
;WITH rs AS
(
SELECT word = TRIM('.,' FROM value ) 
FROM @BlogComment 
CROSS APPLY STRING_SPLIT(BlogCommentContent, SPACE(1))
)
SELECT DISTINCT bw.Word 
FROM rs
INNER JOIN @BannedWords bw ON rs.word = bw.Word;  

SQL Server 2016

;WITH rs AS
(
--SELECT word = TRIM('.,' FROM [value]) 
SELECT word = REPLACE(REPLACE([value],'.',''),',','')
FROM @BlogComment 
CROSS APPLY STRING_SPLIT(BlogCommentContent, SPACE(1))
)
SELECT DISTINCT bw.Word 
FROM rs
INNER JOIN @BannedWords bw ON rs.word = bw.Word; 

输出

+------+
| Word |
+------+
| man  |
| hear |
+------+

如果你想要完全匹配,你的意思是不能有另一件作品接触,所以男人可以匹配"男人"、"男人和女人"、"老鼠和男人"、"一两个男人"。您需要检查

BlogCommentContent = 'man'
left(BlogCommentContent,3) = 'man'
right(BlogCommentContent,3) = 'man'
BlogCommentContent like ' man ' 

人的长度可以用len('man')right()中找到,left().
最后一个值,对于like,可以用concat(' ','man',' ')

构造

最新更新