sql >> Database >  >> RDS >> Oracle

Oracle 11g krijgt alle overeenkomende voorvallen door een reguliere expressie

REGEXP_SUBSTR retourneert slechts één waarde. Je zou van je string een pseudo-tabel kunnen maken en die vervolgens op overeenkomsten kunnen opvragen. Er is een XML-gebaseerde manier om dit te doen die me op dit moment ontgaat, maar het gebruik van connect-by werkt, zolang je maar één bronstring hebt:

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;

... geeft je:

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

... en je kunt dat filteren met een iets eenvoudigere versie van je originele patroon:

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             

Dat is niet erg mooi, maar het is ook niet zo dat meerdere waarden in één veld staan.



  1. Variabelen declareren en instellen in een Select-statement

  2. Vooraf gebouwde Oracle-database voor leren en testen met Oracle Developer VM

  3. Hoe kan ik de laatste twee woorden in een zin in PostgreSQL matchen?

  4. Bulksgewijs invoegen met tekstkwalificatie in SQL Server