我目前在数据库中有知识库文章,系统用分号分隔与文章相关的关键字。
在正面表格上,我有一个限制为 100 个字符的文本框。如何创建一个 SQL 查询来查看文本框中的单词并开始将这些单词与数据库中的关键字进行匹配?
我基本上想创建一个有点像谷歌的搜索。
我目前正在使用LIKE '%{token}%'
. 然而,这还不够好。
我目前在数据库中有知识库文章,系统用分号分隔与文章相关的关键字。
在正面表格上,我有一个限制为 100 个字符的文本框。如何创建一个 SQL 查询来查看文本框中的单词并开始将这些单词与数据库中的关键字进行匹配?
我基本上想创建一个有点像谷歌的搜索。
我目前正在使用LIKE '%{token}%'
. 然而,这还不够好。
如果您有一个反过来与数据库交互的应用程序层,那么您应该生成查询的那部分,在每条记录的句子列的开头、中间和结尾处搜索每个单词,对于每个搜索文本中的单词。
(
sentence LIKE 'token;%'
OR sentence like '%;token;%'
OR sentence like '%;token'
)
例如
Search text = "search google";
Query:
(
sentence LIKE 'search;%'
OR sentence like '%;search;%'
OR sentence like '%;search'
)
AND
(
sentence LIKE 'google;%'
OR sentence like '%;google;%'
OR sentence like '%;google'
)
如果我理解正确,我也有类似的问题。我通过存储函数“split”解决了它。该函数通过分隔符拆分参数并返回一个包含一列的表。
这允许您将返回的表格列与您的文章关键字连接起来。
这是代码的更通用版本
FUNCTION [dbo].[Split] (@s varchar(512))
RETURNS table
AS
RETURN (
WITH Pieces(pn, start, stop) AS (
SELECT 1, 1, dbo.GetNextDelimiter(@s,0)
UNION ALL
SELECT pn + 1, stop + 1, dbo.GetNextDelimiter(@s, stop + 1)
FROM Pieces
WHERE stop > 0
),
Parts(pn,s,start,[end]) as
(SELECT pn,
SUBSTRING(@s, start, CASE WHEN (stop > 0) THEN stop-start ELSE 512 END) AS s, start, stop
FROM Pieces)
SELECT pn as PartNumber,s as StringPart,(start - 1) start,([end] - 1) [end] FROM Parts WHERE s != ''
)
分隔符功能:
FUNCTION [dbo].[GetNextDelimiter](@string nvarchar(max), @startFrom int)
RETURNS int
AS
BEGIN
-- Declare the return variable here
DECLARE @response int
SELECT @response = MIN(delimiterIndex)
FROM
(SELECT CHARINDEX(' ', @string, @startFrom)
UNION
SELECT CHARINDEX('-', @string, @startFrom)
UNION
SELECT CHARINDEX('''', @string, @startFrom)) as Delimiters(delimiterIndex)
WHERE delimiterIndex != 0
IF @response is NULL
SET @response = 0
RETURN @response
END
这将使您不仅可以使用分号,还可以使用任何类型和数量的分隔符。
从这里开始很简单
Select * from Articles WHERE Token in Split(@Input)