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
Libérer: 2025-01-03 16:44:41
original
887 Les gens l'ont consulté

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
Copier après la connexion

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
Copier après la connexion

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
Copier après la connexion

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)
Copier après la connexion

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
----
Copier après la connexion

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;
Copier après la connexion

Cette fonction peut être appelée comme ceci :

select get_list_element('123,222,,432,555', 4) from dual;
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal