it-swarm.com.de

STRING_SPLIT mit einem Trennzeichen aus mehreren Zeichen?

SQL Server 2016 wurde eingeführt STRING_SPLIT Dies ist sehr schnell und ein hervorragender Ersatz für alle hausgemachten Implementierungsaufgaben, die vor 2016 ausgeführt werden.

Leider unterstützt STRING_SPLIT nur ein Einzelzeichen-Trennzeichen, was nicht immer ausreicht. Kennt jemand eine gute Implementierung, die die Verwendung mehrerer Zeichen im Trennzeichen ermöglicht?

8
Petter Brodin

Nun, Sie können immer REPLACE verwenden, um dem Argument ein Einzelzeichen-Trennzeichen hinzuzufügen, bevor Sie es übergeben. Sie müssen nur ein Zeichen auswählen, das in den tatsächlichen Daten wahrscheinlich/unmöglich erscheint. Nehmen wir in diesem Beispiel an, Ihre Originaldaten verwenden drei Pipes als Trennzeichen. Ich habe zufällig ein Unicode-Zeichen ausgewählt, um Folgendes zu ersetzen:

DECLARE 
  @olddelim nvarchar(32) = N'|||', 
  @newdelim nchar(1)     = NCHAR(9999); -- pencil (✏)

DECLARE @x nvarchar(max) = N'foo|||bar|||blat|||splunge';

SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);

Ich habe hier ausführlicher darüber gebloggt:


Kommentar adressieren:

schlechte Lösung. Was ist, wenn die ursprüngliche Zeichenfolge wie 'abc || pqr ||| rst || 123' ist (dynamisch und kann alles enthalten)? Das gewünschte O/P ist 'abc || pqr' und 'rst || 123', aber Ihre Lösung ergibt 'abc' 'pqr' 'rst' '123'

Okay, nehmen wir Ihre Eingabe und sehen, ob meine Lösung die falsche Ausgabe erhält.

DECLARE 
  @olddelim nvarchar(32) = N'|||', 
  @newdelim nchar(1)     = NCHAR(9999); -- pencil (✏)

DECLARE @x nvarchar(max) = N'abc||pqr|||rst||123';

SELECT * FROM STRING_SPLIT(REPLACE(@x, @olddelim, @newdelim), @newdelim);

Ergebnis ist:

abc||pqr
rst||123

Und nicht das, was Sie angenommen haben müssen (aber nicht getestet haben):

abc
pqr
rst
123

Wenn sich Ihre Daten in einer Tabelle befinden, können Sie eine Ansicht erstellen, damit Sie diesen Ausdruck nicht in alle Ihre Abfragen einbeziehen müssen.


Wenn dies nicht funktioniert, weil Ihre Daten möglicherweise einen Bleistift () Enthalten und Sie in 1.111.998 verfügbare Unicode-Zeichen kein einziges Zeichen finden können, das gewonnen hat ' Wenn Sie sich nicht in Ihrem Datensatz befinden, müssen Sie STRING_SPLIT() überspringen, da es fest codiert ist, ein einzelnes Zeichenbegrenzer ( separator Is a single character expression ) zu akzeptieren.

Alternativen wurden hier beantwortet Dutzende Male zuvor , viele bevor STRING_SPLIT() existierte. Diese Methoden funktionieren immer noch.

Ich gehe in dieser Reihe auf viele Alternativen ein und diskutiere auch die Einschränkungen in STRING_SPLIT() (ich diskutiere auch, warum Sie in Betracht ziehen könnten, dies in T-SQL überhaupt nicht mit einer Methode zu tun):

19
Aaron Bertrand