sql >> Databasteknik >  >> RDS >> Oracle

Oracle 11g får alla matchade förekomster av ett reguljärt uttryck

REGEXP_SUBSTR returnerar bara ett värde. Du kan förvandla din sträng till en pseudotabell och sedan fråga efter matchningar. Det finns ett XML-baserat sätt att göra detta på som jag undslipper för tillfället, men att använda connect-by fungerar, så länge du bara har en källsträng:

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;

... ger dig:

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

... och du kan filtrera det med en lite enklare version av ditt originalmönster:

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             

Vilket inte är särskilt vackert, men inte heller att ha flera värden i ett fält.



  1. Hur man ändrar användarlösenord i PostgreSQL

  2. Vad är syftet med systemtabellens master..spt_values ​​och vad är betydelsen av dess värden?

  3. En bugg för uppskattning av kardinalitet i underfrågan

  4. MySQL LIKE IN()?