2016-05-13 127 views
1

我正在嘗試查找與正在搜索的單詞部分具有完全匹配的所有記錄。SQL精確匹配列中的單詞

例如,如果我正在查找其中包含單詞spire的所有記錄,我不想檢索aspireinspire的行。

SELECT * 
FROM Table 
WHERE name LIKE '%SearchedWord%' 
+1

您可能要考慮全文搜索,具體取決於您使用的數據庫。另外,你應該在數據庫中標記你的問題。 –

+0

for MySQL:select * from表where regexp'[[:<:]] SearchWord [[:>:]]' –

回答

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 



然後做在name列中使用的詞語精確匹配以下SELECT聲明:

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

前兩者的名字和喜歡的圖案後添加空格:

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

||是ANSI SQL級聯。有些產品代替+concat()

+0

在類似的地方添加空格意味着它只搜索其中有空格的單詞,不知道該空間是否會在im試圖找到的單詞之前或之後。此外,名稱上的聯繫人應該做什麼,這是試圖搜索的列,並且如果我嘗試將其複製到SQL Server時只是給我沒有結果? – user3691566