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 ?

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 ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-03 16:44:41874parcourir

How to Reliably Extract the Nth Value from a Comma-Separated List in SQL, Handling Nulls?

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn