Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql选择相似文本_Sql_Sql Server - Fatal编程技术网

Sql选择相似文本

Sql选择相似文本,sql,sql-server,Sql,Sql Server,我有一支乒乓球队 Id Name ... 1 Chelsea 2 Arsenal 3 Liverpool 现在我需要搜索我的球队表是否有“切尔西足球俱乐部”这样的名字。在这种情况下,当搜索字符串可能有额外的单词时,如何进行选择查询 我可以试试Lucene.net,但它只是一个很小的用法,有点过头了,学习它需要时间。您需要将字符串拆分并按字符串中的每个单词进行搜索。SQL Server没有本机函数来实现这一点,但web上有各种各样的示例 此函数将获取一个字符串和一个分隔符,

我有一支乒乓球队

Id  Name ...
1    Chelsea
2    Arsenal
3    Liverpool 
现在我需要搜索我的球队表是否有“切尔西足球俱乐部”这样的名字。在这种情况下,当搜索字符串可能有额外的单词时,如何进行选择查询


我可以试试Lucene.net,但它只是一个很小的用法,有点过头了,学习它需要时间。

您需要将字符串拆分并按字符串中的每个单词进行搜索。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;
一旦将分隔字符串转换为表,就可以将其与希望以这种方式搜索和比较值的表连接起来

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 |

我的设计基于Amit Jethva的使用全文搜索

了解有关全文搜索的更多信息

为了实施它


您可以像这样使用

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

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

如果
@s
包含
名称
名称
包含
@s

这将过滤行。谢谢,我在回答之前已经为一个类似的问题编写了一份书面报告(因为它的措辞不好)。幸运的是,我保存了我的工作这是一个过分的解决方案。