我目前在数据库中有知识库文章,系统用分号分隔与文章相关的关键词。
在正面格式上,我有一个限制为100个字符的文本框。如何创建一个SQL查询来查看文本框中的单词并开始将这些单词与数据库中的关键字匹配?
我基本上想要创建一个类似谷歌的搜索。
我目前正在使用LIKE '%{token}%'
。但是,这还不够好。
答案 0 :(得分:0)
如果你有一个应用程序层反过来与数据库交互,那么你应该生成查询的那一部分,在每个记录的句子列的开头,中间和末尾搜索每个单词,对于搜索文本中的每个单词。
(
sentence LIKE 'token;%'
OR sentence like '%;token;%'
OR sentence like '%;token'
)
E.g。
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'
)
答案 1 :(得分:0)
如果我理解正确,我也有类似的问题。 我通过存储函数" 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)