Hvis du vil have alle disse som en enkelt streng i en række dem er der ingen grund til at bruge regulære udtryk, du kan bruge en standard REPLACE()
:
SQL> select replace('2711393|2711441|1234567', '|', ', ') from dual;
REPLACE('2711393|2711441|
-------------------------
2711393, 2711441, 1234567
Hvis du vil have alle disse i en enkelt kolonne, skal du bruge CONNECT BY
som jeg demonstrerer her
. Bemærk venligst, at dette er meget ineffektivt.
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>
Hvis du vil have disse i forskellige kolonner, skal du bruge PIVOT
og du skal vide, hvor mange du har. Jeg går ud fra 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>
Som du kan se, er disse alle fuldstændig forfærdelige og, bortset fra den første, meget ineffektive. Du bør normalisere din database korrekt for at sikre, at du ikke behøver at gøre dette.