Oracle
 sql >> Datenbank >  >> RDS >> Oracle

So rufen Sie die Zeichenfolge mit mehreren Übereinstimmungen mithilfe eines regulären Ausdrucks ab

Wenn Sie all dies als eine einzelne Zeichenfolge in einer Zeile möchten Sie müssen keine regulären Ausdrücke verwenden, Sie können einen Standard REPLACE() :

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

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

Wenn Sie all dies in einer einzigen Spalte haben möchten, müssen Sie CONNECT BY wie ich demonstriere hier . Bitte beachten Sie, dass dies höchst ineffizient ist.

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>

Wenn Sie diese in verschiedenen Spalten haben möchten, müssen Sie verwenden PIVOT und Sie müssen wissen, wie viele Sie haben. Ich nehme an 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>

Wie Sie sehen können, sind diese alle völlig schrecklich und, abgesehen von der ersten, höchst ineffizient. Sie sollten Ihre Datenbank korrekt normalisieren, um sicherzustellen, dass Sie dies nicht tun müssen.