Sql选择类似的文本

nam*_* vo 9 sql sql-server

我有一个桌子队

Id  Name ...
1    Chelsea
2    Arsenal
3    Liverpool 
Run Code Online (Sandbox Code Playgroud)

现在我需要搜索我的队桌是否有像"切尔西足球俱乐部"这样的名字.在这种情况下,当搜索字符串可能有额外的单词时,如何进行选择查询?

我可以尝试使用Lucene.net,但这只是一个小的用途,它有点过分,需要时间来学习它.

Phi*_*ton 9

您需要将字符串拆分并按字符串中的每个单词进行搜索.SQL Server没有本机功能,但Web上有各种示例.

此函数将采用字符串和分隔符,它将通过分隔符拆分字符串并返回结果值的表.

CREATE FUNCTION dbo.SplitVarchar (@stringToSplit varchar(4000), @delimiter CHAR(1))
RETURNS  @Result TABLE(Value VARCHAR(50))AS
BEGIN
    --This CTE will return a table of (INT, INT) that signify the startIndex and stopIndex
    --of each string between delimiters.
    WITH SplitCTE(startIndex, stopIndex) AS
    (
      SELECT 1, CHARINDEX(@delimiter, @stringToSplit)   --The bounds of the first word
      UNION ALL
      SELECT stopIndex + 1, CHARINDEX(@delimiter, @stringToSplit, stopIndex+1)
      FROM SplitCTE             --Recursively call SplitCTE, getting each successive value
      WHERE stopIndex > 0
    )

    INSERT INTO @Result
    SELECT
        SUBSTRING(@stringToSplit,   --String with the delimited data
            startIndex,             --startIndex of a particular word in the string
            CASE WHEN stopIndex > 0 THEN stopIndex-startIndex   --Length of the word
            ELSE 4000 END   --Just in case the delimiter was missing from the string
            ) AS stringValue
    FROM SplitCTE

    RETURN
END;
Run Code Online (Sandbox Code Playgroud)

一旦将分隔的字符串转换为表格,就可以将其与要搜索的表格一起加入,并以这种方式比较值.

DECLARE @TeamName VARCHAR(50)= 'Chelsea FC'

SELECT DISTINCT Name
FROM Team
INNER JOIN (SELECT Value FROM dbo.SplitVarchar(@TeamName, ' ')) t
  ON CHARINDEX(t.Value, Name) > 0
Run Code Online (Sandbox Code Playgroud)

结果:

|    Name |
|---------|
| Chelsea |
Run Code Online (Sandbox Code Playgroud)

SQL小提琴示例

我的设计基于Amit Jethva的Convert Comma Separated String to Table:4种不同的方法

  • 这很让人佩服 (2认同)