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

Oracle 11g får alle matchede forekomster af et regulært udtryk

REGEXP_SUBSTR returnerer kun én værdi. Du kan forvandle din streng til en pseudo-tabel og derefter forespørge efter match. Der er en XML-baseret måde at gøre dette på, der undslipper mig i øjeblikket, men at bruge connect-by fungerer, så længe du kun har én kildestreng:

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;

... giver dig:

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

... og det kan du filtrere med en lidt enklere version af dit originale mø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             

Hvilket ikke er særlig kønt, men heller ikke at have flere værdier i ét felt.



  1. programmæssig kontrol af åben forbindelse i JDBC

  2. Nulstil root-adgangskoden til MySQL

  3. Vælg en MySQL-database på Linux via kommandolinjen

  4. Hvad er de kendte måder at gemme en træstruktur i en relationel DB?