sql >> Databasteknik >  >> RDS >> Oracle

Hur delar man efterfrågad data med avgränsare i Oracle?

Du kan göra det med hjälp av en rekursiv sub-query factoring-sats och enkla strängfunktioner (snarare än långsamma reguljära uttryck).

(Obs:detta har inte heller de problem som hierarkiska frågor gör när det finns flera inmatningsrader av den och genererar exponentiellt fler utdatarader på varje djup eftersom den inte kan korrelera varje rad med sin överordnade så den kommer att korrelera den med alla rader på den tidigare hierarkinivån.)

Oracle-inställningar :

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;

Fråga :

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;

Utdata :

db<>fiol här



  1. Det effektivaste sättet att infoga rader i MySQL-databasen

  2. mysql FULLTEXT sök flera ord

  3. Hur man spårar vilka tabeller/vyer/etc beror på en tabell i Oracle

  4. Oracle 12c XML får värde från svar