2016-12-20 5 views
1

mindestens so viele Zeichen, wie Vergleichsdaten zu ziehen.Wie nur Elemente, die in I herauszufinden versuchen gemeinsame

Der Einfachheit halber einige gefälschte Daten ist unten.

12red34 
56red78 
90blue23 
45blue67 
89yellow10 

Was ich will, ist nur Elemente mit 3 sequentiellen nicht definierten Elementen zu ziehen.

In diesem Fall würde es alle Elemente außer 89yellow10 wie kein anderer Punkt auf der Liste enthält drei Zeichen in einer Zeile, die es passen ziehen. 90blue23 und 45blue67 enthalten beide "blau (oder eine Kombination dieser Buchstaben)" und dasselbe mit den "roten" Elementen.

Dies ist auf einem sehr großen Tisch und Klausel möglich enthält keine Verwendung einer manuellen Suche zu sein scheinen.

Vielen Dank.

+3

Wenn Sie wirklich brauchen nur zu finden Spiele, wo es drei aufeinanderfolgende Zeichen werden es Ihnen nicht schnell zu tun. –

+0

Schnell in Bezug darauf, wie lange es dauern würde, um den Code auszuführen oder schnell in Bezug auf die tatsächliche Ausführung? – SQLISHARD

+1

Codierzeit ist kein Problem. Ausführungszeit ist. Und in Anbetracht dessen, was Sie fragen, wird es nicht etwas sein, das schnell ausgeführt werden kann. Es könnten drei beliebige Zeichen in einer Zeichenfolge sein. Das bedeutet, dass Sie Ihre Werte in alle 3 Zeichenfolgen aufteilen müssen und sehen, ob andere Zeilen dasselbe Muster haben. Es gibt einfach keine Möglichkeit, das schnell zu machen. Ehrlich –

Antwort

0

Dies wird mit den Beispieldaten, aber, Laughing Vergil hat vollständig gültige Punkte.

Declare @YourTable Table (ID int,SomeString varchar(50)) 
Insert Into @YourTable values 
(1,'12red34'), 
(2,'56red78'), 
(3,'90blue23'), 
(4,'45blue67'), 
(5,'89yellow10') 


Declare @MatchLen int = 3 
;with cte as (
     Select ID,B.* 
     From @YourTable A 
     Cross Apply (
        Select N,S=substring(A.SomeString,N,@MatchLen) 
        From (Select Top (Len(A.SomeString)) N=Row_Number() Over (Order By Number) From master..spt_values) N 
        ) B 
     Where substring(A.SomeString,N,3) like Replicate('[A-Z]',@MatchLen) 
) 
Select A.* 
     ,MinS = min(S) 
     ,MaxS = max(S) 
From @YourTable A 
Join ( 
     Select S 
     From cte A 
     Group By S 
     Having Count(*)>=2 
    ) B 
On CharIndex(S,SomeString)>0 
Group By ID,SomeString 
Order By ID 

Returns

ID SomeString MinS MaxS 
1 12red34  red  red 
2 56red78  red  red 
3 90blue23 blu  lue 
4 45blue67 blu  lue 
+0

Ich bin mit CTE sehr ungewohnt. Könnten Sie mir eine Anleitung geben, wie ich das Obige mit einer Where-Klausel eingrenzen könnte? Das obige funktioniert aber, es zieht eine Reihe von inaktiven Elementen, die ich gerne ausschließen würde, aber wenn ich eine where-Klausel hinzugefügt habe, scheint es sie einfach zu ignorieren. – SQLISHARD

+0

@SQLISHARD Die Antwort wurde aktualisiert. Ich habe die erste WHERE nicht sehr klar gemacht. Entfernen Sie einfach den Kommentar - und fügen Sie Ihre WHERE-Bedingung hinzu –

+0

Sie können hinzufügen, wo nach der CTE definiert ist ... SELECT ... von YourCTE WHERE ... ' – JonH

Verwandte Themen