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

Oracle 11g ottiene tutte le occorrenze corrispondenti da un'espressione regolare

REGEXP_SUBSTR restituisce solo un valore. Potresti trasformare la tua stringa in una pseudo-tabella e quindi interrogarla per le corrispondenze. C'è un modo basato su XML per farlo che al momento mi sfugge, ma l'uso di connect-by funziona, purché tu abbia solo una stringa sorgente:

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;

... ti dà:

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

... e puoi filtrarlo con una versione leggermente più semplice del tuo modello originale:

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             

Il che non è molto carino, ma non contiene più valori in un campo.