SQL Server: regex搜索捕获组计数

本文关键字:搜索 Server regex SQL | 更新日期: 2023-09-27 18:15:33

我目前正在c#中为SQL Server数据库开发一个搜索方法。


正则表达式:

/(a)|(b)|(c)|(d)/g

a, b, c &D为搜索关键字。


应用正则表达式的字符串:

a fdh eidb

由随机单词(用字母表示)和上面的一些关键字组成。


期望输出:

三个关键字匹配。


但是如何为SQL Server的SQL查询看起来像返回一个表与Matches列与关键字匹配计数为每一行?


我知道如何在c#中做到这一点,但我想在搜索查询本身做到这一点,这样我就可以对输出进行排序。


感谢你对我的帮助。

SQL Server: regex搜索捕获组计数

我认为没有办法在SQL Server查询中执行正则表达式-除了添加一些托管代码来增加该功能。

下面是如何做到这一点的一个例子-SQL Server正则表达式在T-SQL

看起来REGEX并不是真正的解决方案。

我写了多个SQL函数来完成这项工作:

CREATE FUNCTION [dbo].[KeywordMatches]
(
    @String nvarchar(1000),
    @Keywords nvarchar(1000),
    @Seperator text
)
RETURNS INT
AS
BEGIN
    DECLARE @Count int = 0;
    DECLARE @Keyword varchar(1000);
    DECLARE KeywordsCursor CURSOR FOR  
    SELECT *
    FROM [dbo].StringSplit(@Keywords, @Seperator)
    OPEN KeywordsCursor   
    FETCH NEXT FROM KeywordsCursor INTO @Keyword   
    WHILE @@FETCH_STATUS = 0   
    BEGIN
        IF @String LIKE '%' + @Keyword + '%'
            SET @Count += 1
        FETCH NEXT FROM KeywordsCursor INTO @Keyword
    END
    CLOSE KeywordsCursor   
    DEALLOCATE KeywordsCursor
    RETURN @Count
END

和(回退服务器2016 split_string):

CREATE FUNCTION [dbo].[StringSplit]
(
    @SeperatedWords nvarchar(1000),
    @Seperator char
)
RETURNS @Words TABLE
(
    Word nvarchar(1000)
)
AS
BEGIN
    DECLARE @Position int = -1
    SET @SeperatedWords += @Seperator
    WHILE (@Position > 0 OR @Position = -1)
    BEGIN
        SET @SeperatedWords = SUBSTRING(@SeperatedWords, @Position + 1, LEN(@SeperatedWords) - @Position + 1)
        SET @Position = CHARINDEX(@Seperator, @SeperatedWords)
        /* Only add words that have a length bigger then 0 */
        IF @Position > 1
            /* Add the word to the table */
            INSERT INTO @Words(Word) VALUES(LEFT(@SeperatedWords, @Position - 1))
    END
    RETURN
END


用法:

SELECT Id, Title, [dbo].KeywordMatches(Title, 'blue red green', ' ') AS Matches
FROM Questions
ORDER BY Matches DESC, Date DESC

以上查询按标题和日期中找到的关键字数量排序。


我也读过全文搜索,这可能比这个解决方案更快。