Ich habe eine SQL-Tabelle wie diese:
| SomeID | OtherID | Data
+----------------+-------------+-------------------
| abcdef-..... | cdef123-... | 18,20,22
| abcdef-..... | 4554a24-... | 17,19
| 987654-..... | 12324a2-... | 13,19,20
Gibt es eine Abfrage, bei der ich eine solche Abfrage ausführen kann, SELECT OtherID, SplitData WHERE SomeID = 'abcdef-.......'
die einzelne Zeilen wie folgt zurückgibt:
| OtherID | SplitData
+-------------+-------------------
| cdef123-... | 18
| cdef123-... | 20
| cdef123-... | 22
| 4554a24-... | 17
| 4554a24-... | 19
Grundsätzlich meine Daten am Komma in einzelne Zeilen aufteilen?
Ich bin mir bewusst, dass das Speichern einer comma-separated
Zeichenfolge in einer relationalen Datenbank dumm klingt, aber der normale Anwendungsfall in der Consumer-Anwendung macht dies wirklich hilfreich.
Ich möchte die Aufteilung in der Anwendung nicht durchführen, da ich Paging benötige. Daher wollte ich die Optionen untersuchen, bevor ich die gesamte App umgestalte.
Es ist SQL Server 2008
(nicht R2).
sql-server
tsql
split
comma
Michael Stum
quelle
quelle
Antworten:
Sie können die wunderbaren rekursiven Funktionen von SQL Server verwenden:
Beispieltabelle:
Die Abfrage
Ausgabe
quelle
Data
vonvarchar(max)
auf geändert wirdvarchar(4000)
, zcreate table Testdata(SomeID int, OtherID int, Data varchar(4000))
.OPTION (maxrecursion 0)
Mit SQL Server 2016 ist das Warten endlich vorbei . Sie haben die Split-String-Funktion eingeführt
STRING_SPLIT
:Alle anderen Methoden zum Teilen von Zeichenfolgen wie XML, Tally-Tabelle, while-Schleife usw. wurden von dieser
STRING_SPLIT
Funktion weggeblasen .Hier ist ein ausgezeichneter Artikel mit Leistungsvergleich: Leistungsüberraschungen und Annahmen: STRING_SPLIT .
Bei älteren Versionen ist die Verwendung der Tally-Tabelle hier eine Split-String-Funktion (bestmöglicher Ansatz).
Empfohlen von Tally OH! Eine verbesserte SQL 8K "CSV Splitter" -Funktion
quelle
value
nichtSplitData
.Überprüfen Sie dies
quelle
quelle
CROSS APPLY
, ist das irgendwie nützlich!select t.OtherID, x.* from testData t cross apply (select item as Data from dbo.Split(t.Data,',') ) x
Ab Februar 2016 - siehe das TALLY-Tabellenbeispiel - ist es sehr wahrscheinlich, dass mein TVF ab Februar 2014 übertroffen wird. Den ursprünglichen Beitrag unten für die Nachwelt behalten:
Zu viel wiederholter Code für meinen Geschmack in den obigen Beispielen. Und ich mag die Leistung von CTEs und XML nicht. Auch eine explizite,
Id
damit Verbraucher, die auftragsspezifisch sind, eineORDER BY
Klausel angeben können .quelle
Schön zu sehen, dass es in der Version 2016 gelöst wurde, aber für alle, die dies nicht tun, sind hier zwei verallgemeinerte und vereinfachte Versionen der oben genannten Methoden.
Die XML-Methode ist kürzer, erfordert aber natürlich die Zeichenfolge, um den XML-Trick zuzulassen (keine 'schlechten' Zeichen).
XML-Methode:
Rekursive Methode:
Funktion in Aktion
XML-METHODE 2: Unicode-freundlich 😀 (Ergänzung mit freundlicher Genehmigung von Max Hodges)
create function dbo.splitString(@input nVarchar(max), @Splitter nVarchar(99)) returns table as Return SELECT Split.a.value('.', 'NVARCHAR(max)') AS Data FROM ( SELECT CAST ('<M>' + REPLACE(@input, @Splitter, '</M><M>') + '</M>' AS XML) AS Data ) AS A CROSS APPLY Data.nodes ('/M') AS Split(a);
quelle
Bitte beziehen Sie sich unten auf TSQL. Die Funktion STRING_SPLIT ist nur unter der Kompatibilitätsstufe 130 und höher verfügbar.
TSQL:
ERGEBNIS:
Farbe
rot blau grün gelb schwarz
quelle
Sehr spät, aber probieren Sie es aus:
Also hatten wir folgendes: tbl_Sample:
Nach dem Ausführen dieser Abfrage:
Vielen Dank!
quelle
STRING_SPLIT
ist geschickt, aber es erfordert SQL Server 2016. docs.microsoft.com/en-us/sql/t-sql/functions/…quelle
mit nur winzigen kleinen Änderungen an der obigen Abfrage ...
quelle
Ich benutze immer die XML-Methode. Stellen Sie sicher, dass Sie VALID XML verwenden. Ich habe zwei Funktionen zum Konvertieren zwischen gültigem XML und Text. (Ich neige dazu, die Wagenrückläufe zu entfernen, da ich sie normalerweise nicht brauche.
quelle
SELECT (SELECT '<&> blah' + CHAR(13)+CHAR(10) + 'next line' FOR XML PATH(''))
Funktion
Anwendungsfall
Oder einfach eine Auswahl mit mehreren Ergebnismengen
quelle
Unten funktioniert auf SQL Server 2008
Erhält alle kartesischen Produkte mit den Ursprungs-Tabellenspalten plus "Elementen" der geteilten Tabelle.
quelle
Mit der folgenden Funktion können Sie Daten extrahieren
quelle