SQL Server:查找LIKE字符串的百分比匹配

时间:2014-08-13 22:11:24

标签: sql sql-server regex string

我正在尝试编写查询,以便在备注或TEXT列中查找搜索字符串的百分比匹配。

这就是我的开始:

SELECT * 
FROM NOTES 
WHERE UPPER(NARRATIVE) LIKE 'PAID CALLED RECEIVED'

最终,我想做的是:

  1. 按空格拆分搜索字符串,并单独搜索字符串
  2. 中的所有字词
  3. 根据百分比匹配对结果进行降序排序
  4. 例如,在上述场景中,搜索字符串中的每个单词占总数的33.333%。具有3个匹配(100%)的NARRATIVE应位于结果的顶部,而包含2个关键字的匹配(66.666%)将更低,并且匹配包含1个关键字(33.333%)会更低。

    然后,我希望在列中显示该行的结果百分比匹配,以及该表中的所有其他列(*)。

    希望这是有道理的,可以做到的。有关如何进行的任何想法?这必须在SQL Server中完成,我宁愿不写任何CTE。

    提前感谢您的任何指导。

2 个答案:

答案 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变量。