Il faut se méfier! L'expression regexp_substr au format '[^,]+'
ne renverra pas la valeur attendue s'il y a un élément nul dans la liste et que vous voulez cet élément ou un après. Considérez cet exemple où le 4ème élément est NULL et je veux le 5ème élément et m'attends donc à ce que le '5' soit renvoyé :
SQL> select regexp_substr('1,2,3,,5,6', '[^,]+', 1, 5) from dual;
R
-
6
Surprise! Il renvoie le 5ème élément NON-NULL, pas le 5ème élément réel ! Des données incorrectes sont renvoyées et vous ne pouvez même pas les attraper. Essayez ceci à la place :
SQL> select regexp_substr('1,2,3,,5,6', '(.*?)(,|$)', 1, 5, NULL, 1) from dual;
R
-
5
Ainsi, le REGEXP_SUBSTR corrigé ci-dessus indique de rechercher la 5ème occurrence de 0 ou plusieurs caractères délimités par des virgules suivis d'une virgule ou de la fin de la ligne (permet le prochain séparateur, que ce soit une virgule ou la fin de la ligne) et lorsqu'il est trouvé, renvoie le 1er sous-groupe (les données n'incluant PAS la virgule ou la fin de la ligne).
Le modèle de correspondance de recherche '(.*?)(,|$)'
expliqué :
( = Start a group
. = match any character
* = 0 or more matches of the preceding character
? = Match 0 or 1 occurrences of the preceding pattern
) = End the 1st group
( = Start a new group (also used for logical OR)
, = comma
| = OR
$ = End of the line
) = End the 2nd group
EDIT :Plus d'informations ajoutées et simplifié la regex.
Voir ce post pour plus d'informations et une suggestion pour encapsuler cela dans une fonction pour une réutilisation facile :REGEX pour sélectionner la nième valeur d'une liste, en autorisant les nulls C'est le post où j'ai découvert le format '[^,]+'
a le problème. Malheureusement, c'est le format regex que vous verrez le plus souvent comme réponse aux questions concernant l'analyse d'une liste. Je frémis de penser à toutes les données incorrectes renvoyées par '[^,]+'
!