我不知道我所考虑的方法(问题与之相关)是否是达到预期结果的最佳方式,所以如果有人有更好的想法,我会全智。这就是我想要完成的事情。给定一组以空格分隔的搜索词,我想搜索特定的列,无论术语的顺序如何,都会得到一致的结果。所以例如"棕色狗"和#34;狗棕"应该返回类似的结果。我有一个表值函数,它接受一个字符串和一个分隔符,并将拆分字符串作为单列表返回。
CREATE FUNCTION dbo.Split
(
@char_array varchar(500), @delimiter char(1)
)
RETURNS
@parsed_array table
(
Parsed varchar(50)
)
AS
BEGIN
DECLARE @parsed varchar(50), @pos int
SET @char_array = LTRIM(RTRIM(@char_array))+ @delimiter
SET @pos = CHARINDEX(@delimiter, @char_array, 1)
IF REPLACE(@char_array, @delimiter, '') <> ''
BEGIN
WHILE @pos > 0
BEGIN
SET @parsed = LTRIM(RTRIM(LEFT(@char_array, @pos - 1)))
IF @parsed <> ''
BEGIN
INSERT INTO @parsed_array (Parsed)
VALUES (@parsed)
END
SET @char_array = RIGHT(@char_array, LEN(@char_array) - @pos)
SET @pos = CHARINDEX(@delimiter, @char_array, 1)
END
END
RETURN
END
GO
我要搜索的列是varchar(2000)。现在我正在搜索它:
SELECT ID FROM Table WHERE Description LIKE '%' + @searchTerm + '%'
但是,鉴于我在上面描述的多个术语处于不同顺序的场景,这并没有返回一致的结果。是否有可能以某种方式将表从函数连接到列并获得所需的结果?请注意,结果应包含描述包含任何顺序的所有搜索字词的所有行。
答案 0 :(得分:1)
要从SQL角度回答您的问题,是的,您可以将函数加入到表中(虽然我已通过临时表)并使用HAVING子句确保所有搜索条件都是包括,像这样。
SELECT
f.Parsed
INTO
#s
FROM
dbo.Split(@terms) f
DECLARE @c INT = (SELECT COUNT(*) FROM #s)
SELECT
t.ID
FROM
Table t
INNER JOIN #s s on t.Description LIKE '%' + s.Parsed + '%'
GROUP BY
t.ID
HAVING
COUNT(*) = @c
然而,正如对该问题的评论所暗示的那样,这种搜索方法留下了许多未解决的问题。如果你可以看看SQL Server Full-Text Search - 设置更多的努力,但效果要好得多。