Das Organisieren von Daten in Datenbankdatensätzen als durch Kommas getrennte Werte führt zu Herausforderungen bei der Suche nach einer tabellarischen Darstellung. In diesem Artikel werden verschiedene SQL-Techniken zum effizienten Konvertieren solcher Daten in Zeilen für eine einfache Datenextraktion und -bearbeitung untersucht.
Betrachten Sie die folgende Tabellenstruktur, bei der die Wertespalte durch Kommas getrennte Werte enthält:
<code>CREATE TABLE tbl1 ( id NUMBER, value VARCHAR2(50) ); INSERT INTO tbl1 VALUES (1, 'AA, UT, BT, SK, SX'); INSERT INTO tbl1 VALUES (2, 'AA, UT, SX'); INSERT INTO tbl1 VALUES (3, 'UT, SK, SX, ZF');</code>
Das Ziel besteht darin, diese Daten in ein Tabellenformat umzuwandeln, wobei jeder Wert in einer eigenen Zeile getrennt ist:
<code>ID | VALUE ------------- 1 | AA 1 | UT 1 | BT 1 | SK 1 | SX 2 | AA 2 | UT 2 | SX 3 | UT 3 | SK 3 | SX 3 | ZF</code>
Eine Möglichkeit besteht darin, die REGEXP_SUBSTR- und CONNECT BY-Klausel von Oracle zu nutzen:
<code>SELECT DISTINCT id, TRIM(REGEXP_SUBSTR(value, '[^,]+', 1, level) ) VALUE, LEVEL FROM tbl1 CONNECT BY REGEXP_SUBSTR(value, '[^,]+', 1, LEVEL) IS NOT NULL ORDER BY id, LEVEL;</code>
Diese Methode verwendet einen regulären Ausdruck (REGEXP_SUBSTR), um jede Teilzeichenfolge zu extrahieren, während CONNECT BY die durch Kommas getrennten Werte rekursiv durchläuft.
Eine andere Technik besteht darin, einen gemeinsamen Tabellenausdruck (CTE) mit einer rekursiven Vereinigung zu verwenden:
<code>WITH t (id, res, val, lev) AS ( SELECT id, TRIM(REGEXP_SUBSTR(value, '[^,]+', 1, 1)) RES, VALUE AS VAL, 1 AS LEV FROM tbl1 WHERE REGEXP_SUBSTR(VALUE, '[^,]+', 1, 1) IS NOT NULL UNION ALL SELECT id, TRIM(REGEXP_SUBSTR(VAL, '[^,]+', 1, LEV + 1)) RES, VAL, LEV + 1 AS LEV FROM t WHERE REGEXP_SUBSTR(VAL, '[^,]+', 1, LEV + 1) IS NOT NULL ) SELECT id, res, lev FROM t ORDER BY id, lev;</code>
Diese Methode verwendet einen rekursiven CTE, um durch Kommas getrennte Werte in einzelne Elemente aufzuteilen.
Die dritte Lösung verwendet einen rekursiven CTE mit der INSTR-Funktion, um die Start- und Endposition jedes Teilstrings zu identifizieren:
<code>WITH t (id, value, start_pos, end_pos) AS (SELECT id, VALUE, 1, INSTR(VALUE, ',') FROM tbl1 UNION ALL SELECT id, VALUE, end_pos + 1, INSTR(VALUE, ',', end_pos + 1) FROM t WHERE end_pos > 0 ) SELECT id, SUBSTR(VALUE, start_pos, DECODE(end_pos, 0, LENGTH(VALUE) + 1, end_pos) - start_pos) AS VALUE FROM t ORDER BY id, start_pos;</code>
Diese Methode verwendet INSTR, um die Position jedes Teilstrings rekursiv zu bestimmen und sie entsprechend zu extrahieren.
Das obige ist der detaillierte Inhalt vonWie kann ich durch Kommas getrennte Werte in Oracle SQL effizient in Zeilen konvertieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!