SQL Server |在字符串中查找特定关键字



我需要你的帮助。

我尝试将手动创建的特定关键字查找与事实注释表相匹配。目的:试图对这些评论进行分类。

示例

  • 评论:比奥迪的同等车型动力大得多
  • 关键词列表中的关键词:奥迪
  • 关键字列表中的类别:竞争对手

我试过类似的东西

SELECT 
FC.comment_id, KWM.keyword, KWM.category
FROM 
dbo.factcomments FC
INNER JOIN 
(SELECT  
keywordmatcher = '%[,. ]' + keyword + '[ .,]%',
keyword,
category
FROM 
dbo.keywordlist) KWM ON FC.comment LIKE KWM.keywordmatcher

也许这是一个糟糕的例子,但我只想要特定的匹配-->如果关键字是事实注释中另一个单词的一部分(例如"part"而不是"分开"(,则不需要匹配。

因为我的第一次尝试与字符串开头/结尾的关键字不匹配,我做了一件非常糟糕的事情:

SELECT 
FC.comment_id, KWM.keyword, KWM.category
FROM 
dbo.factcomments FC
INNER JOIN 
(SELECT  
keyword,
category
FROM 
dbo.keywordlist) KWM ON FC.comment LIKE '%[,. ]' + KWM.keyword + '[ .,]%' 
OR FC.comment LIKE KWM.keyword + '[ .,]%' 
OR FC.comment LIKE '%[,. ]' + KWM.keyword

我知道。。。

除此之外,我还想检测那些有"!"、"?"、"、"-"的评论或者在这些关键词之前或之后的"_"——有什么聪明的方法吗?

事实上,我想要任何在关键字之前或之后没有单词字符的评论,任何其他字符都可以。

在JOIN条件下,用空格字符替换((FC.Comment中的所有非字母数字字符,并用空格将其包围。类似这样的东西:

' '+REPLACE(FC.Comment, ...)+' '

然后这样做你的LIKE比较:

LIKE '% '+KWM.Keyword+' %'

可能有不同的方法。

declare @comment varchar(255)=concat(' ','A lot more power than the equivalent from Audi.',' ')
declare @keyword varchar(50)='Audi'
DECLARE @allowedStrings VARCHAR(100)
DECLARE @teststring VARCHAR(100)
SET @allowedStrings = '><()!?@_-./?!*&^%$#()~'
;WITH CTE AS
(
SELECT SUBSTRING(@allowedStrings, 1, 1) AS [String], 1 AS [Start], 1 AS [Counter]
UNION ALL
SELECT SUBSTRING(@allowedStrings, [Start] + 1, 1) AS [String], [Start] + 1, [Counter] + 1 
FROM CTE 
WHERE [Counter] < LEN(@allowedStrings)
)
SELECT @comment = REPLACE(@comment, CTE.[String], '') FROM CTE

随意更改@comment变量并检查结果

SELECT 
@comment as Comment , @keyword as KeyWord,
iif(substring(@comment,PATINDEX(concat('%',@keyword,'%'),@comment)-1,len(@keyword)+2)=' Audi ',1,0) as isMatch

这是从https://stackoverflow.com/a/29162400/10735793

最新更新