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

Opdel kolonnetekst til rækker (udtræk skilletegn i parentes) ORACLE SQL

Du kan bruge det regulære udtryk (([^(]*?(\(.*?\))?)*)(,|$) at matche:

  • [^(]*? Nul-eller-flere (men så få som muligt) tegn, der ikke åbner parentes
  • (\(.*?\))? Derefter, valgfrit, en indledende parentes og så få tegn som muligt indtil den afsluttende parentes.
  • ( )* Indpakket i en indfangende gruppe gentaget nul eller flere gange
  • ( ) Indpakket i en optagelsesgruppe for at kunne henvise til hele det matchede element
  • (,|$) Efterfulgt af enten et komma eller slutningen af ​​strengen.

Sådan:

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;
 

Forespørgsel 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
 

Resultater :

| 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. FEJL:kolonne med relation eksisterer ikke PostgreSQL, Kan ikke køre indsæt forespørgsel

  2. MySQL GROUP &COUNT Flere tabeller

  3. MySQL-fejlkode:1411. Forkert datetime-værdi:'' for funktionen str_to_date

  4. Opdater rækker efter mysql select foreach