2017-03-14 21 views
0

説明やその他のテキストフィールド内の単語と一致する必要のあるランダムな単語のリストが表示され、それらの単語が連続している必要はありません。これは私にすべての一致を返す必要があります。あなたがそれについて考えるなら、それはあらゆる単語一致検索機能のようなものです。"LIKE"と "IN"の選択条件SQL

私が戻ってくる文字列は、空のスペースに分割され、その結果、各行ごとに別々の単語が含まれています。

WHERE IN句を使用できないため、このテーブルを再利用して任意の単語に一致するものを見つける方法を教えてください。

DECLARE @split TABLE(word NVARCHAR(2000)) 

SELECT * 
      FROM StockSummary 
     WHERE Reference in (select word from @split) 
      OR Name in (select word from @split) 
      OR AlternativeReference in (select word from @split) 
      OR InternalReference in (select word from @split) 
+0

Oracle、MS SQL Server、またはおそらくSybaseを使用していますか? – jarlh

+0

@jarlh MS SQL Server – user1800674

+0

クエリの問題は何ですか? –

答えて

2

ひどく効率的ではありませんが、私は、これはあなたが探しているものだと思います。これを行うためのより良い方法、全文索引付け。

DECLARE @split TABLE(word NVARCHAR(2000)); 

SELECT DISTINCT ss.* 
FROM StockSummary ss 
INNER JOIN @split s 
    ON ss.Reference LIKE '%' + s.word + '%' 
    OR ss.Name LIKE '%' + s.word + '%' 
    OR ss.AlternativeReference LIKE '%' + s.word + '%' 
    OR ss.InternalReference LIKE '%' + s.word + '%'; 

これは基本的に実行中のクロスジョインです。

はすべての単語を含む行を見つけるには:

DECLARE @split TABLE(word NVARCHAR(2000)); 

SELECT Reference, Name, AlternativeReference, InternalReference 
FROM (
    SELECT DISTINCT ss.Reference, ss.Name, ss.AlternativeReference, ss.InternalReference, s.word 
    FROM StockSummary ss 
    INNER JOIN @split s 
     ON ss.Reference LIKE '%' + s.word + '%' 
     OR ss.Name LIKE '%' + s.word + '%' 
     OR ss.AlternativeReference LIKE '%' + s.word + '%' 
     OR ss.InternalReference LIKE '%' + s.word + '%'; 
) 
GROUP BY Reference, Name, AlternativeReference, InternalReference 
HAVING COUNT(*) = (SELECT COUNT(*) FROM @split); 

DISTINCTはあなたのリストに同じ単語を持っている場合は二回重複を処理することですが、それはあなたがしたい(結果に二回もする必要はありませんそれを行うにはCHARINDEXともっとやらなければなりません)。

+0

これは単語の一致ですが、検索クエリのすべての単語を含むレコードを見つけるにはどうすればよいですか?彼らは連続している必要はありませんのでご注意ください。 – user1800674

+1

上記は「任意の」単語です。「すべて」の単語のバージョンを追加します。概念は、基本的にすべての単語が少なくとも1回はヒットする必要があるということです。 –

+0

これを行う方法の例を私に示すことができれば素晴らしいことでしょう。 – user1800674

0
DECLARE @Test TABLE (TestId INT IDENTITY, Test VARCHAR(8), Test2 VARCHAR(8), Test3 VARCHAR(8)); 

INSERT INTO @Test (Test, Test2, Test3) VALUES ('Duck', NULL, NUll), (NULL, NULL, 'Duck'), ('Sit', NULL, NULL), ('Kneel', NULL, NULL), (NULL, 'Hey', NULL); 

--Data as is 
Select * 
From @Test 

--Insert in some hunting data into a table 
DECLARE @Find TABLE (word VARCHAR(8)); 
INSERT INTO @Find (word) VALUES ('Duck'),('Sit'); 

--match cte on multiple join conditions 
; With x as 
    (
    SELECT 
     a.* 
    , CASE WHEN b.Word IS NOT NULL OR c.word IS NOT NULL OR d.word IS NOT NULL THEN 1 ELSE 0 END AS Found 
    From @Test a 
     LEFT JOIN @Find b ON a.Test = b.Word 
     LEFT JOIN @Find c ON a.Test2 = c.Word 
     LEFT JOIN @Find d ON a.Test3 = d.Word 
     ) 
Select * 
From x 
WHERE Found = 1