Heim >Datenbank >MySQL-Tutorial >Wie konvertiere ich durch Kommas getrennte Werte in Zeilen in Oracle?
Konvertieren Sie durch Kommas getrennte Werte in Zeilen in Oracle
Komma ist ein gängiges Trennzeichen, um mehrere Werte als einzelne Zeichenfolge darzustellen. Wenn Sie jedoch mit Daten in Oracle arbeiten, müssen Sie diese Werte möglicherweise in verschiedene Zeilen aufteilen. Dies kann auf verschiedene Weise erreicht werden.
Rekursive Abfrage mit regulären Ausdrücken
Eine Möglichkeit besteht darin, eine rekursive Abfrage mit einem regulären Ausdruck zu verwenden, um jeden Wert zu extrahieren:
<code class="language-sql">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 Abfrage verwendet die Funktion REGEXP_SUBSTR, um jede Teilzeichenfolge ohne Komma zu extrahieren und verkettet dann die Ergebnisse mithilfe einer rekursiven Abfrage.
Rekursive Abfrage ohne reguläre Ausdrücke
Ein weiterer rekursiver Ansatz, der die Verwendung regulärer Ausdrücke vermeidet:
<code class="language-sql">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 Abfrage verwendet die INSTR-Funktion, um die Position des Kommas zu ermitteln, und verwendet dann die SUBSTR-Funktion, um die einzelnen Werte zu extrahieren.
CTE mit rekursiver Vereinigung
Die dritte Methode verwendet einen gemeinsamen Tabellenausdruck (CTE) mit einer rekursiven Vereinigung:
<code class="language-sql">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 Abfrage verwendet den UNION ALL-Operator, um einen rekursiven CTE zu erstellen, der alle Nicht-Komma-Teilzeichenfolgen extrahiert.
Das obige ist der detaillierte Inhalt vonWie konvertiere ich durch Kommas getrennte Werte in Zeilen in Oracle?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!