2016-04-29 8 views
1

Ich habe eine Tabelle Document mit einigen Spalten z. DocumentTitle. Sieht wie folgt aus:Abfrage für eine Liste von Zeichenfolge mit wie


Dokument

  • Id (unique)
  • Document (varchar (200))

in meiner Anwendung Sie eine Zeichenfolge eingeben Sie suchen nach "Rechnung 4711". Jetzt soll meine Anwendung nach allen Dokumenten suchen, in denen beide Wörter im Titel stehen. So Dokumente mit Titel foo4711.pdf, invoice_bar.pdf werden nicht gefunden. Dokumente mit dem Titel invoce 4711.pdf oder test4711invoce.png sollen gefunden werden.

Da ich dies in einer Prozedur schreibe, kann ich keine feste Parameteranzahl für Suchstrings festlegen. Ich bekomme einen Parameter, z.B. invoice 4711 und meine Split-Methode gibt eine Tabelle mit allen Elementen wie (und ja, mit dem% -Zeichen)


Artikel

% 4711%

% Rechnung%


Sooo, wenn ich jetzt versuche, alle Dokumente zu bekommen, wo diese beiden Werte übereinstimmen, bekomme ich ein falsches Ergebnis (aber, ja, es macht immer Sinn: D)

info: die fn_split- Funktion nimmt den Suchst als ersten Parameter und der zweite Parameter ist die in Scheiben geschnittenen Zeichen

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 

beide Abfragen gibt die Ergebnis, wo eines dieser Wörter enthalten ist - nicht beides. Irgendeine Idee, was das Problem hier ist? oder wie funktioniert die Abfrage richtig?

+0

Zuerst die Datenstruktur, um eine richtige Junction-Tabelle für die Elemente zu haben. –

+0

Hallo, was Sie suchen müssen, ist:% 4711% Rechnung% und% Rechnung% 4711%, also müssen Sie Ihre Split-Funktion in einer "Scrumbler" -Funktion ändern. Versuchen Sie etwas Ähnliches wie Select items + '%' von fn_split ('invoice 4711', '') a, fn_split ('invoice 4711', '') b Wo a.items <> b.items für xml path (' ') – GigiS

+0

@GigiS was wäre wenn' Rechnung 4711 John Smith Texas '? – Serg

Antwort

2

Zählen Sie sie.

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

nett, funktioniert perfekt! Danke –

Verwandte Themen