我正在尝试编写查询,以便在备注或TEXT
列中查找搜索字符串的百分比匹配。
这就是我的开始:
SELECT *
FROM NOTES
WHERE UPPER(NARRATIVE) LIKE 'PAID CALLED RECEIVED'
最终,我想做的是:
例如,在上述场景中,搜索字符串中的每个单词占总数的33.333%。具有3个匹配(100%)的NARRATIVE
应位于结果的顶部,而包含2个关键字的匹配(66.666%)将更低,并且匹配包含1个关键字(33.333%)会更低。
然后,我希望在列中显示该行的结果百分比匹配,以及该表中的所有其他列(*)。
希望这是有道理的,可以做到的。有关如何进行的任何想法?这必须在SQL Server中完成,我宁愿不写任何CTE。
提前感谢您的任何指导。
答案 0 :(得分:1)
以下是我提出的建议:
DECLARE @VISIT VARCHAR(25) = '999232'
DECLARE @KEYWORD VARCHAR(100) = 'PAID,CALLED,RECEIVED'
DECLARE SPLIT_CURSOR CURSOR FOR
SELECT RTRIM(LTRIM(VALUE)) FROM Rpt_Split(@KEYWORD, ',')
IF OBJECT_ID('tempdb..#NOTES_FF_SEARCH') IS NOT NULL DROP TABLE #NOTES_FF_SEARCH
SELECT N.VISIT_NO
,N.CREATE_DATE
,N.CREATE_BY
,N.NARRATIVE
,0E8 AS PERCENTAGE
INTO #NOTES_FF_SEARCH
FROM NOTES_FF AS N
WHERE N.VISIT_NO = @VISIT
DECLARE @KEYWORD_VALUE AS VARCHAR(255)
OPEN SPLIT_CURSOR
FETCH NEXT FROM SPLIT_CURSOR INTO @KEYWORD_VALUE
WHILE @@FETCH_STATUS = 0
BEGIN
UPDATE #NOTES_FF_SEARCH
SET PERCENTAGE = PERCENTAGE + ( 100 / @@CURSOR_ROWS )
WHERE UPPER(NARRATIVE) LIKE '%' + UPPER(@KEYWORD_VALUE) + '%'
FETCH NEXT FROM SPLIT_CURSOR INTO @KEYWORD_VALUE
END
CLOSE SPLIT_CURSOR
DEALLOCATE SPLIT_CURSOR
SELECT * FROM #NOTES_FF_SEARCH
WHERE PERCENTAGE > 0
ORDER BY PERCENTAGE, CREATE_DATE DESC
可能有一种更有效的方法可以做到这一点,但我开始的其他每条道路都以死胡同结束。谢谢你的帮助
答案 1 :(得分:0)
如果你想进行“百分比”匹配,你需要做两件事:计算字符串中的单词数量并计算你关心的单词数量。在给出一些指导之前,我会说全文搜索可能会做你想要的一切,并且很多更有效率。
假设搜索字符串具有空格分隔的单词,您可以使用表达式计算单词:
(len(narrative) - len(replace(narrative, ' ', '') + 1) as NumWords
您可以通过成功替换来计算匹配的单词。因此,对于关键字,它可能类似于删除每个关键字,修复空格和计算单词。
整体代码最好用子查询表示。生成的查询类似于:
select n.*
from (select n.*,
(len(narrative) - len(replace(narrative, ' ', '') + 1.0) as NumWords,
ltrim(rtrim(replace(replace(replace(narrative + ' ', @keyword1 + ' ', ''),
@keyword2 + ' ', ''),
@keyword3 + ' ', ''))) as NoKeywords
from notes n
) n
order by 1 - (len(NoKeywords) - len(replace(NoKeywords, ' ', '') + 1.0) / NumWords desc;
SQL Server - 与许多数据库一样 - 在解析字符串方面不是特别擅长。您可以在查询之外执行此操作,并相应地分配@keyword
变量。