sql >> Database >  >> RDS >> Oracle

Hoe opgevraagde gegevens te splitsen op scheidingsteken in Oracle?

U kunt dit doen met behulp van een recursieve factoringclausule voor subquery's en eenvoudige tekenreeksfuncties (in plaats van langzame reguliere expressies).

(Opmerking:dit heeft ook niet de problemen die hiërarchische query's hebben als er meerdere invoerrijen zijn die exponentieel meer uitvoerrijen genereren op elke diepte, omdat het niet elke rij kan correleren met zijn bovenliggende, dus zal het correleren met alle rijen op het vorige hiërarchieniveau.)

Oracle-configuratie :

CREATE TABLE some_table( some_id, value ) AS
  SELECT 8, 'A1,A2,A3;A4,A5,A6' FROM DUAL UNION ALL
  SELECT 8, 'B1,B2,B3;B4,B5,B6' FROM DUAL UNION ALL
  SELECT 8, 'C1,C2,C3;C4,C5,C6' FROM DUAL;

Zoekopdracht :

WITH line_start_end ( some_id, value, startidx, endidx ) AS (
  SELECT some_id,
         value,
         1,
         INSTR( value, ';', 1 )
  FROM   some_table
  WHERE  some_id = 8
UNION ALL
  SELECT some_id,
         value,
         endidx + 1,
         INSTR( value, ';', endidx + 1 )
  FROM   line_start_end
  WHERE  endidx > 0
)
SELECT some_id,
       CASE
       WHEN endidx = 0
       THEN SUBSTR( value, startidx )
       ELSE SUBSTR( value, startidx, endidx - startidx )
       END AS value
FROM   line_start_end;

Uitvoer :

db<>fiddle hier



  1. Hoe postgresql 9.4 jsonb naar object te converteren zonder functie/server-side taal

  2. Hoe verbinding maken met localhost met postgres_fdw?

  3. Dag, maand, jaar in datum optellen en aftrekken via MySql Query

  4. MySQL PREPARE-instructie in opgeslagen procedures