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.