Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como buscar a string de correspondência múltipla usando uma expressão regular


Se você quiser tudo isso como uma única string em uma linha não há necessidade de usar expressões regulares, você pode usar um padrão REPLACE() :
SQL> select replace('2711393|2711441|1234567', '|', ', ') from dual;

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

Se você quiser tudo isso em uma única coluna, precisará usar CONNECT BY como demonstro aqui . Observe que isso é altamente ineficiente.
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 você quiser isso em colunas diferentes, você precisa usar PIVOT e você precisa saber quantos você tem. Estou assumindo 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>

Como você pode ver, tudo isso é completamente horrível e, exceto o primeiro, altamente ineficiente. Você deve normalizar seu banco de dados corretamente para garantir que não precise fazer isso.