Sql选择类似的文本

时间:2015-05-02 05:16:49

标签: sql sql-server

我有一个表格团队

Id  Name ...
1    Chelsea
2    Arsenal
3    Liverpool 

现在我需要搜索我的队桌是否有像#34; Chelsea FC"这样的名字。在这种情况下,当搜索字符串可能有额外的单词时,如何进行选择查询?

我可以尝试使用Lucene.net,但只是因为一小部分内容而感觉有点过头而且学习它需要时间。

3 个答案:

答案 0 :(得分:9)

您需要将字符串拆分并按字符串中的每个单词进行搜索。 SQL Server没有这样做的本机功能,但网上有各种各样的例子。

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

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;

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

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

结果:

|    Name |
|---------|
| Chelsea |

SQL Fiddle example

我的设计基于Amit Jethva的Convert Comma Separated String to Table : 4 different approaches

答案 1 :(得分:2)

您可以这样使用like

declare @s varchar(20) = 'Chelsey FC'

select * from Team
where name like '%' + @s + '%' or
        @s like '%' + name + '%'

如果@s包含NameName包含@s,则会过滤行。

答案 2 :(得分:0)