sql >> Base de Datos >  >> RDS >> Oracle

Cómo obtener la cadena de coincidencia múltiple usando una expresión regular

Si quiere todos estos como una sola cadena en una fila ellos no hay necesidad de usar expresiones regulares, puede usar un estándar REPLACE() :

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

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

Si desea todo esto en una sola columna, debe usar CONNECT BY como demuestro aquí . Tenga en cuenta que esto es muy 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>

Si desea estos en diferentes columnas, debe usar PIVOT y necesitarás saber cuántos tienes. Supongo que 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 puede ver, todos estos son completamente horribles y, salvo el primero, altamente ineficientes. Debe normalizar su base de datos correctamente para asegurarse de no tener que hacer esto.