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

Comment récupérer la chaîne de correspondance multiple à l'aide d'une expression régulière

Si vous voulez tout cela en une seule chaîne dans une ligne pour eux, il n'est pas nécessaire d'utiliser des expressions régulières, vous pouvez utiliser un standard REPLACE() :

SQL> select replace('2711393|2711441|1234567', '|', ', ') from dual;

REPLACE('2711393|2711441|
-------------------------
2711393, 2711441, 1234567

Si vous voulez tout cela dans une seule colonne, vous devez utiliser CONNECT BY comme je le démontre ici . Veuillez noter que cela est très inefficace.

SQL>  select regexp_substr('2711393|2711441|1234567', '[^|]+', 1, level)
  2     from dual
  3  connect by regexp_substr('2711393|2711441|1234567'
  4                           , '[^|]+', 1, level) is not null;

REGEXP_SUBSTR('2711393|2711441|1234567','[^|]+',1,LEVEL)
--------------------------------------------------------------------------

2711393
2711441
1234567

SQL>

Si vous les voulez dans différentes colonnes, vous devez utiliser PIVOT et vous aurez besoin de savoir combien vous en avez. Je suppose 3.

SQL> select *
  2    from (
  3   select regexp_substr('2711393|2711441|1234567', '[^|]+', 1, level) as a
  4        , level as lvl
  5     from dual
  6  connect by regexp_substr('2711393|2711441|1234567'
  7                           , '[^|]+', 1, level) is not null
  8          )
  9   pivot ( max(a)
 10          for lvl in (1,2,3)
 11          )
 12         ;

1          2          3
---------- ---------- ----------
2711393    2711441    1234567

SQL>

Comme vous pouvez le voir, ils sont tous complètement horribles et, sauf le premier, très inefficaces. Vous devez normaliser correctement votre base de données pour vous assurer que vous n'avez pas à le faire.