Oracle SQL String Split in mehrere Zeilen/Rows

Auch mit dem besten Datenbankmodell gibt es Importe und Situationen in denen in einem Feld mehrer Werte durch Separatoren getrennt hinterlegt sind.

Um diese Werte in Zeilen umzuwandeln gibt es genügend Varianten im Internet zu finden: z.b. auf Stackoverflow. Die meisten Lösungen arbeiten dabei mit regulären Ausdrücken und der Funktion „regexp_substr“. Die gehen einfach von der Hand, wirken sich bei größeren Datenmengen, wie sie in einem Datawarehouse vorkommen, aber durchaus auf die Performance aus. Um nicht mit Kanonen auf Spatzen zu schießen, läßt sich das Splitten alternativ mit einfachen Stringfunktionen lösen.

Im folgenden Beispiel gilt es den String „12,22,3“ in 12 – 22 – 3 zu teilen.

with input as
(
select '12,22,3' str from dual
)
select level, str,
trim(',' from substr(str, instr(str,',',1,level), instr(str,',',1,level+1)-instr(str,',',1,level)))
,instr(str,',',1,level), instr(str,',',1,level+1)
from input
connect by instr(str,',',1,level+1) != 0 ;

Um nun den Separator nicht noch mehrfach zu wiederholen, wäre es noch schön diesen in einem eigenen Block auszulagern. Das würde hier aber der Leserlichkeit schaden.

Reguläre Ausdrücke sind eine prima Sache, müssen aber mit Bedacht eingesetzt werden. Manch harmloser Ausdruck kann auch durchaus die Datenbank auf Anschlag belasten. Wenn möglich sind einfache, berechenbare Funktion vorzuziehen.

Dieser Beitrag wurde unter Oracle abgelegt und mit , , , , verschlagwortet. Setze ein Lesezeichen auf den Permalink.