web-dev-qa-db-fra.com

STRING_SPLIT avec un séparateur à plusieurs caractères?

SQL Server 2016 a introduit STRING_SPLIT qui est très rapide et un excellent remplacement pour toute implémentation maison que les gens déploieraient avant 2016.

Malheureusement, STRING_SPLIT ne prend en charge qu'un séparateur à un seul caractère, ce qui n'est pas toujours suffisant. Quelqu'un connaît-il une bonne implémentation qui permet d'utiliser plusieurs caractères dans le séparateur?

8
Petter Brodin

Eh bien, vous pouvez toujours utiliser REPLACE pour ajouter un délimiteur à un caractère à l'argument avant de le passer. Il vous suffit de choisir un caractère qui est peu probable/impossible d'apparaître dans les données réelles. Dans cet exemple, supposons que vos données d'origine utilisent trois canaux comme délimiteur; J'ai choisi un caractère Unicode au hasard pour remplacer:

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);

J'ai blogué à ce sujet plus en détail ici:


Adresser un commentaire:

mauvaise solution. que faire si la chaîne d'origine est comme 'abc || pqr ||| rst || 123' (dynamique et peut contenir n'importe quoi). o/p souhaité est 'abc || pqr' et 'rst || 123' mais votre solution donnera 'abc' 'pqr' 'rst' '123'

D'accord, prenons votre entrée et voyons si ma solution obtient la mauvaise sortie.

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);

Le résultat est:

abc||pqr
rst||123

Et pas ce que vous devez avoir supposé (mais pas testé) ceci:

abc
pqr
rst
123

Si vos données sont dans une table, vous pouvez créer une vue afin de ne pas avoir à factoriser cette expression dans toutes vos requêtes.


Si cela ne fonctionne pas, car vous pourriez avoir un crayon () Dans vos données et vous ne pouvez pas trouver un seul caractère dans le 1 111 998 caractères Unicode disponibles qui a gagné ' t être dans votre ensemble de données, vous devrez ignorer STRING_SPLIT(), car il est codé en dur pour accepter un délimiteur à un seul caractère ( separator Is a single character expression ).

Les alternatives ont été répondues ici des dizaines de fois auparavant , beaucoup avant que STRING_SPLIT() n'existe. Ces méthodes fonctionnent toujours.

Je passe en revue de nombreuses alternatives et je discute également des limitations dans STRING_SPLIT(), dans cette série (je discute également pourquoi vous pourriez envisager de ne pas le faire dans T-SQL en utilisant une méthode du tout):

19
Aaron Bertrand