SQL精确匹配列中的单词

时间:2016-05-13 11:12:59

标签: sql sql-server match sql-like

我正在尝试查找与我正在搜索的单词部分完全匹配的所有记录。

例如,如果我在查找其中包含aspire字样的所有记录,我就不希望使用inspireSELECT * FROM Table WHERE name LIKE '%SearchedWord%' 检索行。

{{1}}

2 个答案:

答案 0 :(得分:1)

在名称和类似模式之前和之后添加空格:

select * from Table where ' ' || name || ' ' like '% SearchWord %'

||是ANSI SQL串联。有些产品会改为+concat()

答案 1 :(得分:1)

您需要从name列中拆分单词,然后才需要完全匹配。

需要创建以下SplitWords功能。它得到一个句子,并在其中返回单词:

CREATE FUNCTION SplitWords(@text varchar(8000))
   RETURNS @words TABLE (
      pos smallint primary key,
      value varchar(8000)
   )
AS
BEGIN
   DECLARE
      @pos smallint,
      @i smallint,
      @j smallint,
      @s varchar(8000)

   SET @pos = 1
   WHILE @pos <= LEN(@text) 
   BEGIN 
      SET @i = CHARINDEX(' ', @text, @pos)
      SET @j = CHARINDEX(',', @text, @pos)
      IF @i > 0 OR @j > 0
      BEGIN
         IF @i = 0 OR (@j > 0 AND @j < @i)
            SET @i = @j

         IF @i > @pos
         BEGIN
            -- @i now holds the earliest delimiter in the string
            SET @s = SUBSTRING(@text, @pos, @i - @pos)

            INSERT INTO @words
            VALUES (@pos, @s)
         END 
         SET @pos = @i + 1

         WHILE @pos < LEN(@text) 
            AND SUBSTRING(@text, @pos, 1) IN (' ', ',')
            SET @pos = @pos + 1 
      END 
      ELSE 
      BEGIN 
         INSERT INTO @words 
         VALUES (@pos, SUBSTRING(@text, @pos, LEN(@text) - @pos + 1))

         SET @pos = LEN(@text) + 1 
      END 
   END 
   RETURN 
END



然后执行以下SELECT语句,以准确匹配name列中使用的字词:

SELECT  *
FROM    [Table]
WHERE   'SearchedWord' IN (SELECT value FROM dbo.SplitWords(name))