sql >> Databasteknik >  >> RDS >> Oracle

Dela kolumntext till rader (extrahera avgränsare inom parentes) ORACLE SQL

Du kan använda det reguljära uttrycket (([^(]*?(\(.*?\))?)*)(,|$) att matcha:

  • [^(]*? Noll-eller-fler (men så få som möjligt) tecken utan parentes
  • (\(.*?\))? Sedan, valfritt, en inledande parentes och så få tecken som möjligt tills den avslutande parentesen.
  • ( )* Inlindad i en fångstgrupp som upprepas noll eller fler gånger
  • ( ) Insvept i en fångstgrupp för att kunna referera till hela det matchade objektet
  • (,|$) Följt av antingen ett kommatecken eller slutet av strängen.

Så här:

SQL Fiddle

Oracle 11g R2 Schema Setup :

CREATE TABLE table_name ( ID, Kategory ) AS
SELECT 1, 'ATD 5(2830),ATO 4(510),EDI 1,EH A1,SCI 2,SS 1,STO-SE 1(oral, CNS, blood),STO-SE 2(oral, respiratory effects)' FROM DUAL;

Fråga 1 :

SELECT ID,
       l.COLUMN_VALUE AS item,
       REGEXP_SUBSTR(
         Kategory,
         '(([^(]*?(\(.*?\))?)*)(,|$)',
         1,
         l.COLUMN_VALUE,
         NULL,
         1
       ) AS value
FROM   table_name t
       CROSS JOIN
       TABLE(
         CAST(
           MULTISET(
             SELECT LEVEL
             FROM   DUAL
             CONNECT BY LEVEL < REGEXP_COUNT( t.Kategory, '(([^(]*?(\(.*?\))?)*)(,|$)' )
           )
           AS SYS.ODCINUMBERLIST
         )
       ) l

Resultat :

| ID | ITEM |                               VALUE |
|----|------|-------------------------------------|
|  1 |    1 |                         ATD 5(2830) |
|  1 |    2 |                          ATO 4(510) |
|  1 |    3 |                               EDI 1 |
|  1 |    4 |                               EH A1 |
|  1 |    5 |                               SCI 2 |
|  1 |    6 |                                SS 1 |
|  1 |    7 |          STO-SE 1(oral, CNS, blood) |
|  1 |    8 | STO-SE 2(oral, respiratory effects) |



  1. Generera SQL-schema från XML

  2. Hur kan jag påskynda databasprocessen?

  3. Ta bort en SQL-frågeresultatuppsättning

  4. FATAL:kunde inte komma åt den privata nyckelfilen /etc/ssl/private/ssl-cert-snakeoil.key:Tillstånd nekad