2016-04-29 4 views
1

テーブルDocumentにいくつかの列があります。 DocumentTitle。次のようになります。likeの文字列のリストを照会します。


ドキュメント

  • ID(UNIQUEIDENTIFIER)
  • DocumentTitle(VARCHAR(200))あなたは、文字列を入力して自分のアプリケーションに

「請求書4711」のように検索します。今では、私のアプリケーションは、これらの単語の両方がタイトルにあるすべてのドキュメントを検索します。 タイトルfoo4711.pdfinvoice_bar.pdfの文書は見つかりません。 タイトルがinvoce 4711.pdfまたはtest4711invoce.pngの文書が見つかります。

私はこの手順を書いているので、私はsearchstringsのための修正パラメータカウントを設定することはできません。 1つのパラメータが取得されています。 invoice 4711と私の分割方法は、(%の-signsで、はい)などのすべての項目を含むテーブルを返します


項目

% 4711パーセント

%の送り状%


Soooこれらの値の両方が一致するすべてのドキュメントを取得しようとすると、私は間違った結果を得ます(ただし、それは常に意味があります:D)

情報:fn_split-関数は、最初のパラメータとして検索文字列を取り、2番目のパラメータはスライス符号

select * 
from document 
WHERE 1 = (
    select case 
     when document.documenttitle like items then 1 else 0 end 
    from fn_split('invoice 4711', ' ') 
    where document.documenttitle like items 
); 

select * 
from document 
inner join fn_split('invoice 4711', ' ') 
on document.DocumentTitle like items 

あるこれらのクエリの両方が返さ結果はそれらの単語のいずれかが含まれています - 両方ではありません。 何が問題なのですか?またはクエリが正しく機能するかどうか

+0

最初に、アイテムの適切な接合テーブルを持つデータ構造。 –

+0

こんにちは、あなたが検索しなければならないのは、%4711%の請求書%と%の請求書%4711%ですので、あなたは "スクラムブラー"機能で分割機能を変更する必要があります。 Uはfn_split( '請求書4711'、 '')、fn_split( '請求書4711'、 '')から項目を選択する '%'と同様のものを試してください。b a.items <> b.items for xml path( ' ') – GigiS

+0

@GigiSもし'請求書4711ジョンスミステキサス '? – Serg

答えて

2

declare @arg varchar(100) ='invoice 4711'; 
select * 
from document 
cross apply ( 
select n=count(*) from fn_split(@arg, ' ') x where 
document.DocumentTitle like x.items) cnt 
where (select count(*) from fn_split(@arg, ' ')) = cnt.n; 
+0

素晴らしい、完璧に動作します!どうも –

関連する問題