SQL服务器|在字符串中查找特定的关键字

时间:2018-12-03 19:36:21

标签: sql 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'而不是'apart'),则不匹配。

因为我的第一次尝试在字符串的开头/结尾没有匹配关键字,所以我做了一些非常讨厌的事情:

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

我知道...

除了我也想检测在这些关键字之前或之后带有“!”,“?”,“'',“-”或“ _”的注释的事实之外,还有什么聪明的方法可以这样做?

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

2 个答案:

答案 0 :(得分:0)

在JOIN条件下,用空格字符替换FC.Comment中所有非字母数字字符,并用空格包围。像这样:

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

然后像这样进行您的LIKE比较:

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

答案 1 :(得分:0)

可能是另一种方法。

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借来的想法