如何将一个表中的所有行与t-sql中另一个表中的列匹配?

时间:2016-06-17 22:58:58

标签: sql-server tsql

我不知道我所考虑的方法(问题与之相关)是否是达到预期结果的最佳方式,所以如果有人有更好的想法,我会全智。这就是我想要完成的事情。给定一组以空格分隔的搜索词,我想搜索特定的列,无论术语的顺序如何,都会得到一致的结果。所以例如"棕色狗"和#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 + '%'

但是,鉴于我在上面描述的多个术语处于不同顺序的场景,这并没有返回一致的结果。是否有可能以某种方式将表从函数连接到列并获得所需的结果?请注意,结果应包含描述包含任何顺序的所有搜索字词的所有行。

1 个答案:

答案 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 - 设置更多的努力,但效果要好得多。