我需要你的帮助。
我尝试将手动创建的特定关键字查找与事实注释表匹配。目的:尝试对这些评论进行分类。
示例
我尝试过类似的
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
我知道...
除了我也想检测在这些关键字之前或之后带有“!”,“?”,“'',“-”或“ _”的注释的事实之外,还有什么聪明的方法可以这样做?
事实上,我想要任何在关键字前后没有单词字符的注释,其他任何字符都可以。
答案 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