Oracle
 sql >> Base de données >  >> RDS >> Oracle

REGEX pour sélectionner la nième valeur dans une liste, autorisant les valeurs nulles

Merci à ceux qui ont répondu. Après avoir lu vos réponses et les réponses dans le lien fourni, je suis arrivé à cette solution :

SQL> select REGEXP_SUBSTR('1,,3,4,5', '(.*?)(,|$)', 1, 2, NULL, 1) data
  2  from dual;

Data
----

Ce qui peut être décrit comme "regardez la 2ème occurrence d'un ensemble facultatif de zéro ou plusieurs caractères suivis d'une virgule ou de la fin de la ligne, et renvoyez le 1er sous-groupe (qui correspond aux données moins la virgule ou la fin du ligne).

J'ai oublié de mentionner que j'ai testé avec le null dans différentes positions, plusieurs nulls, en sélectionnant différentes positions, etc.

La seule mise en garde que j'ai pu trouver est que si le champ que vous recherchez est supérieur au nombre disponible, il renvoie simplement NULL, vous devez donc en être conscient. Pas de problème pour mon cas.

EDIT :Je mets à jour la réponse acceptée au profit des futurs chercheurs qui pourraient tomber dessus.

L'étape suivante consiste à encapsuler le code afin qu'il puisse être transformé en une fonction plus simple et réutilisable. Voici la source de la fonction :

  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;

Cela cache les complexités des regex aux développeurs qui ne sont peut-être pas si à l'aise avec cela et rend le code plus propre de toute façon lors de son utilisation. Appelez-le comme ceci pour obtenir le 4ème élément :

select get_list_element('123,222,,432,555', 4) from dual;