2016-05-13 7 views
1

私が探している単語の一部に完全に一致するすべてのレコードを検索しようとしています。列の単語のSQLの完全一致

たとえば、単語がspireであるすべてのレコードを検索していた場合は、aspireまたはinspireという行を検索したくないです。

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

使用しているデータベースに応じて全文検索を検討してください。また、質問をデータベースに付ける必要があります。 –

+0

for MySQL:選択*テーブルから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

のように空白を追加すると、空白が含まれている単語だけが検索されます。そのスペースが、見つけようとしている単語の前後になるかどうかを知ることはできません。また、名前の連絡先はどうすればいいですか?それは検索しようとしている列ですが、SQL Server用に複製しようとすると結果が表示されません。 – user3691566

関連する問題