Oracle
 sql >> Database >  >> RDS >> Oracle

Come recuperare la stringa di corrispondenza multipla utilizzando un'espressione regolare

Se vuoi tutti questi come una singola stringa in una riga non c'è bisogno di usare espressioni regolari puoi usare uno standard REPLACE() :

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

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

Se vuoi tutti questi in una singola colonna, devi usare CONNECT BY come dimostro qui . Tieni presente che questo è altamente inefficiente.

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>

Se li desideri in colonne diverse, devi utilizzare PIVOT e dovrai sapere quanti ne hai. Presumo 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>

Come puoi vedere, questi sono tutti completamente orribili e, salvo il primo, altamente inefficienti. Dovresti normalizzare correttamente il tuo database per assicurarti di non doverlo fare.