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

Oracle 11g obtiene todas las ocurrencias coincidentes mediante una expresión regular

REGEXP_SUBSTR solo devuelve un valor. Puede convertir su cadena en una pseudo-tabla y luego consultarla en busca de coincidencias. Hay una forma de hacer esto basada en XML que se me escapa en este momento, pero el uso de conexión funciona, siempre que solo tenga una cadena de origen:

SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
FROM (
    SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str FROM DUAL
)
CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1;

... te da:

SUBSTR             
--------------------
Txa233141b           
Ta233141             
Ta233142             
Ta233147            
Ta233148            

... y puedes filtrar eso con una versión un poco más simple de tu patrón original:

SELECT substr
FROM (
    SELECT REGEXP_SUBSTR(str, '[^ ]+', 1, LEVEL) AS substr
    FROM (
        SELECT 'Txa233141b Ta233141 Ta233142 Ta233147 Ta233148' AS str
        FROM DUAL
    )
    CONNECT BY LEVEL <= LENGTH(REGEXP_REPLACE(str, '[^ ]+')) + 1
)
WHERE REGEXP_LIKE(substr, '^[A-Za-z]{2}[0-9]{5,}$');

SUBSTR             
--------------------
Ta233141             
Ta233142             
Ta233147             
Ta233148             

Lo cual no es muy bonito, pero tampoco lo es tener múltiples valores en un campo.