Maison >base de données >tutoriel mysql >Comment extraire de manière fiable la nième valeur d'une liste séparée par des virgules dans SQL, en gérant les valeurs nulles ?
Solution Regex pour sélectionner une valeur spécifique dans une liste séparée par des virgules avec des valeurs nulles
Lors de l'extraction de la nième valeur d'une liste séparée par des virgules à l'aide de REGEXP_SUBSTR (), la gestion des valeurs nulles peut être délicate. Voici un examen détaillé du problème et une solution complète.
Tout d'abord, considérons le scénario suivant :
SQL> select REGEXP_SUBSTR('1,2,3,4,5,6', '[^,]+', 1, 2) data from dual; D - 2
Cette requête récupère avec succès la deuxième valeur non nulle ("2") de la liste en utilisant l'expression régulière [^,] . Cependant, lorsque la deuxième valeur est nulle, la requête renvoie le troisième élément :
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]+', 1, 2) data from dual; D - 3
Pour résoudre ce problème, une expression régulière plus flexible est nécessaire pour autoriser les caractères facultatifs :
SQL> select REGEXP_SUBSTR('1,,3,4,5,6', '[^,]*', 1, 4) data from dual; D - 3
Cependant, cette expression rationnelle échoue également pour les nombres supérieurs à zéro.
En fin de compte, la solution réside dans un système plus sophistiqué regex :
REGEX_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1)
Cette regex capture les données avant la nième occurrence d'une virgule ou la fin de la ligne. Le résultat est :
Data ----
Pour encapsuler cette solution dans une fonction réutilisable, considérons le code suivant :
FUNCTION GET_LIST_ELEMENT(string_in VARCHAR2, element_in NUMBER, delimiter_in VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS BEGIN RETURN REGEXP_SUBSTR(string_in, '(.*?)(\'||delimiter_in||'|$)', 1, element_in, NULL, 1); END GET_LIST_ELEMENT;
Cette fonction peut être appelée comme ceci :
select get_list_element('123,222,,432,555', 4) from dual;
Indépendamment des valeurs nulles potentielles ou de l'élément spécifique sélectionné, cette solution fournit une méthode robuste et élégante pour extraire des valeurs à partir de listes séparées par des virgules dans Oracle. SQL.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!