2017-12-01 1 views
0

Wie Jungs,Daten aus einer SELECT LIKE extrahieren

Ich habe ein Problem, Daten aus einem Feld anzuzeigen, die viele Namen für ein Semikolon getrennt enthält. Mein Kunde möchte mit nur Namen eine Anzeige, die den Suchkriterien entsprechen, wie die unter Beispiel:

Fields 
    Domain     Names     
    --------------------------------------------------------- 
    England     Alice;Bob;Carl;David;Elton 

Was ich brauche, ist, mit der folgenden Abfrage:

select * from database where Names like 'a%' 

bekommen

England     Alice;Carl;David 

oder sogar mit

select * from database where Names like 'Da%' 

bekommen

England     David 

und auch,

select * from database where Names like '%' 

England     Alice;Bob;Carl;David;Elton 

erhalten mit dem ich arbeite MS-SQL 2012 und ich habe eine StoredProcedure die ausgewählten Zeilen zu bekommen, aber jedes Mal wenn ich bekomme das Ergebnis wie oben/letzte Zeile: alle Namen.

Wie kann ich nur die gefundene Zeichenfolge nach den eingegebenen Kriterien anzeigen?

Vielen Dank für jede Hilfe.

+0

Warum sollten Sie eine Suche auf 'Da' erwarten, um' England' zurückzugeben? Aus der Spitze meines Kopfes, in die Volltextsuche suchen. –

+0

Meine Frage bezieht sich NICHT auf die Rückgabe Englands, sondern nur auf den vollständigen Namen, den ich in den Suchkriterien verwendet habe. –

+0

@Tim, meine Suchkriterien in dem Feld Namen - siehe oben. –

Antwort

0

Die erste Sache, die mit diesen Namen zu tun ist, dann in einzelne Reihen zu teilen DANN können Sie nach ihnen einzeln suchen. Es gibt eine Vielzahl von "Split String" -Funktionen für T-SQL, daher werde ich keine Abhandlung darüber anbieten, welche zu verwenden ist. z.B. Split strings the right way – or the next best way (Aaron Bertrand)

Im Folgenden finden Sie eine Möglichkeit, es zu tun, dass für kleine (ish) Anforderungen in Ordnung ist:

Demo at SQL Fiddle

CREATE TABLE Table1 ([Domain] varchar(7), [Names] varchar(26)) ; 

INSERT INTO Table1 ([Domain], [Names]) 
VALUES ('England', 'Alice;Bob;Carl;David;Elton') ; 

Abfrage:

select 
    t.Domain 
    , split.value('.', 'varchar(50)') as [Name] 
from Table1 t 
cross apply (
    select cast('<r>'+replace(Names, ';', '</r><r>')+'</r>' as xml) 
    ) as ca1(split1) 
cross apply split1.nodes('r') as ca2 (split) 

Results:

| Domain | Name | 
|---------|-------| 
| England | Alice | 
| England | Bob | 
| England | Carl | 
| England | David | 
| England | Elton | 

Sobald Sie die Zeilen auf diese Weise haben, ist es einfach, diejenigen zu finden, die den Kriterien entsprechen. Sobald Sie das getan haben (falls gewünscht), ist es möglich, die Namen wieder in eine getrennte Zeichenkette unter Verwendung von "for xml path" zu kombinieren (und es gibt viele Beispiele, wie man das auch verwendet). siehe How Stuff and 'For Xml Path' work in Sql Server