Datensatz aufsplitten - SQL (PL/SQL)

Gary82

Grünschnabel
Hallo, ich mal wieder ... :D

Dieses Mal mit etwas anderem. Ich versuche eine leichte Funktion in einen SQL-String einzubauen, die eine gewisse Spalte in einzelne neue aufspaltet ? Habe auch schon etwas in der Richtung entwickelt, aber einerseits geht es nur bedingt, nämlich wenn alle Kriterien auftachen und zum anderen ist es irgendwie unschön. (Mehr dazu unten im Beispiel)

Kennt sich also jemand mit dem Zersplitten eines Datensatzes aus, und eben diesen dann in Extra-Spalten aufnehmen? (Ich kenne es bis dato nur leicht mit "Case", aber ich lerne auch gern dazu.)

Hier also das Beispiel:

Spalte... _|_ Attributes
... ___|___ ...
... ___|___ *1) (siehe unten, das wäre der größtmögliche Inhalt, auch von der Reihenfolge)
... ___|___ ...
... ___|___ Machine Group=ANL555a-XX1#
... ___|___ Item Time=000.0000#Machine Group=XXX-YYY/AA-abcd#
... ___|___ Batch Time=00.0000#
... ___|___ ...


*1)
Load Time=000.0000#Batch Time=00.0000#Item Time=0000.0000#Unload Time=00.0000#Batch Size=000#Machine Group=ANL123#Yield=0.0000#Travel Time=00.0000#Sampling Rate=0.0#

Tja, und was ich jetzt einfach haben will: Jeder "Abschnitt" zwischen #...# in eine extra Spalte ?! Man kann aber denke ich nicht nach den Zeicheninhalten gehen, da diese sich eben ändern können, mal sind sie 20 Zeichen lang, manchmal 18 - je nachdem, was für eine Zeit/Zahl im Feld (oben) auftaucht...

Spalte _|_ LoadTime _|_ BatchTime _|_ ItemTime _|_ usw.
... ___|___ 000.0000 _|_ 00.0000 __|__ 0000.0000

Hoffe, es kann mir jemand freundlicherweise weiterhelfen, und das ich es gut erklärt habe. :)


Zum Schluss, dass was ich bisher habe - aber wie gesagt, eher unschön wie ich finde. ;)

Code:
...
, CASE 
    WHEN (ATTRIBUTES Like '%Load Time%') THEN SUBSTR(ATTRIBUTES, 1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 1)-1))
  ELSE '' END AS LOADTIME
, CASE
    WHEN (ATTRIBUTES Like '%Batch Time%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 1)+1, (REGEXP_INSTR(ATTRIBUTES , '#', 1, 2)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 1)-1))
  ELSE '' END AS BATCHTIME
, CASE
    WHEN (ATTRIBUTES Like '%Item Time%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 2)+1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 3)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 2)-1))
  ELSE '' END AS ITEMTIME
, CASE
    WHEN (ATTRIBUTES Like '%Unload Time%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 3)+1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 4)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 3)-1))
  ELSE '' END AS UNLOADTIME
, CASE
    WHEN (ATTRIBUTES Like '%Batch Size%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 4)+1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 5)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 4)-1))
  ELSE '' END AS BATCHSIZE
, CASE
    WHEN (ATTRIBUTES Like '%Machine Group%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 5)+1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 6)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 5)-1))
  ELSE '' END AS MASCHINEGROUP
, CASE
    WHEN (ATTRIBUTES Like '%Yield%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 6)+1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 7)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 6)-1))
  ELSE '' END AS YIELD
, CASE
    WHEN (ATTRIBUTES Like '%Travel Time%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 7)+1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 8)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 7)-1))
  ELSE '' END AS TRAVELTIME
, CASE
    WHEN (ATTRIBUTES Like '%Sampling Rate%') THEN SUBSTR(ATTRIBUTES, REGEXP_INSTR(ATTRIBUTES, '#', 1, 8)+1, (REGEXP_INSTR(ATTRIBUTES, '#', 1, 9)-REGEXP_INSTR(ATTRIBUTES, '#', 1, 8)-1))
  ELSE '' END AS SAMPLINGRATE
...

Edit: Was ich hier bei euch gefunden habe, ist dem schon ähnlich, aber ich bekomme es nicht von MySQL in Oracle-Form umgeformt...?! (Ich habe eben keine SUBSTRING_INDEX oder LOCATIONs, usw.)
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück