Heim > Datenbank > MySQL-Tutorial > Wie teile ich durch Kommas getrennte Werte in Oracle ohne Duplikate in mehrere Zeilen auf?

Wie teile ich durch Kommas getrennte Werte in Oracle ohne Duplikate in mehrere Zeilen auf?

Patricia Arquette
Freigeben: 2024-12-30 12:32:10
Original
542 Leute haben es durchsucht

How to Split Comma-Separated Values in Oracle into Multiple Rows Without Duplicates?

Mehrere durch Kommas getrennte Werte in einer Oracle-Tabelle in mehrere Zeilen ohne Duplikate aufteilen

Beim Umgang mit Daten in Oracle-Tabellen ist dies häufig erforderlich um durch Kommas getrennte Werte in mehrere Zeilen aufzuteilen. Mit einer Kombination aus CONNECT BY und regulären Ausdrücken lässt sich dies erreichen. Es ist jedoch wichtig, doppelte Zeilen im Abfrageergebnis zu vermeiden.

Abfrage zur Aufteilung kommagetrennter Werte

WITH CTE AS (
  SELECT 'a,b,c,d,e' temp, 1 slno FROM DUAL
  UNION
  SELECT 'f,g' temp, 2 slno FROM DUAL
  UNION
  SELECT 'h' temp, 3 slno FROM DUAL
)

SELECT TRIM(REGEXP_SUBSTR(temp, '[^,]+', 1, level)), slno
FROM CTE
CONNECT BY level <= REGEXP_COUNT(temp, '[^,]+')
AND PRIOR slno = slno
AND PRIOR DBMS_RANDOM.VALUE IS NOT NULL
Nach dem Login kopieren

Erklärung

Diese Abfrage verwendet eine rekursive WITH-Klausel, um einen Common Table Expression (CTE) namens CTE zu erstellen. Der CTE besteht aus drei Datenzeilen mit durch Kommas getrennten Werten.

Die Haupt-SELECT-Anweisung extrahiert dann die einzelnen Werte aus der temporären Spalte. Die TRIM-Funktion wird verwendet, um alle führenden oder nachgestellten Leerzeichen aus den Werten zu entfernen. Die Funktion REGEXP_SUBSTR() ist für die Aufteilung der temporären Spalte in separate Werte basierend auf dem Komma-Trennzeichen verantwortlich.

Die CONNECT BY-Klausel führt die rekursive Aufteilung durch. Dadurch wird sichergestellt, dass jedem durch Kommas getrennten Wert eine eindeutige Ebene zugewiesen wird. Die Bedingung PRIOR slno = slno stellt sicher, dass die Ebene nur innerhalb jeder Zeile (slno) erhöht wird.

Zusätzlich wird die Bedingung PRIOR DBMS_RANDOM.VALUE IS NOT NULL verwendet, um zu verhindern, dass doppelte Zeilen generiert werden. DBMS_RANDOM.VALUE ist eine Pseudospalte, die eine Zufallszahl zurückgibt. Durch den Vergleich mit IS NOT NULL führen wir ein Zufallselement ein, das Duplikate eliminiert.

Das Endergebnis ist eine Tabelle mit mehreren Zeilen, die jeweils einen einzelnen Wert aus der ursprünglichen durch Kommas getrennten Zeichenfolge enthalten. Dieser Ansatz teilt die Werte effektiv auf, ohne dass doppelte Zeilen entstehen.

Das obige ist der detaillierte Inhalt vonWie teile ich durch Kommas getrennte Werte in Oracle ohne Duplikate in mehrere Zeilen auf?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage