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查询中执行正则表达式-除了添加一些托管代码来增加该功能。
下面是如何做到这一点的一个例子-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
以上查询按标题和日期中找到的关键字数量排序。
我也读过全文搜索,这可能比这个解决方案更快。