我想在一个表的 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',' ')