Oracle: Stringdatum erkennen

BaseBallBatBoy

Erfahrenes Mitglied
Hallo!

Ich habe eine externe Tabelle:
rownumber, cola,colb, colc, cold, cole, colf, ......, colz
Sind alles varchar2 (255).

Die externe Tabelle zeigt auf ein CSV File und rownumber gibt den Zeilenindex im CSV file an.

Nun weiss ich, dass where rownumber=3 habe ich ab cole immer eine Stringkombination aus Monat und Jahr. Das habe ich solange bis da Total steht, dann ist fertig.

Hier ein Beispiel:

cole, colf, colg, colh
jan -11, feb -11, mar -11, Total

Ich möchte nun erkennen welche Spalten mich zu interessieren haben (in diesem beispiel cole, colf, colg) und dann möchte ich das nummernformat yyyymm haben. (also jan -11 -> 201101).

Wie gehe ich sowas am besten an?
Regex, mapping Tabelle, cases, ....

Danke für eure Hinweise & Gruss
BBBB
 
Huh, eine komplizierte Beschreibung die ich auch nach 3maligem Durchlesen noch ncith wirklich verstanden habe.

Also, so wie ich das verstehe, ergibt das eine Tabelle im Format
Code:
cole    | colf    | colg    | colh
--------|---------|----------------
jan -11 | feb -11 | mar -11 | Total

Dich interessieren jetzt die Resultate cole bis colh. Wie soll das AUsgegeben werden? Am besten zuerst alles Untereinander setzen und dann filtern

SQL:
-- Stelle sicher dass das englische Datumsformat eingestellt ist. Nur so wird aus 'mar' auch 03
ALTER SESSION SET NLS_DATE_LANGUAGE = 'ENGLISH';
WITH 
--simuliere die Daten
mydata AS
(
  SELECT 3 AS rownumber, 'test 3' AS cola, 'jan -11' AS cole, 'mar -11' AS colf, 'feb -11' AS colg, 'Total' AS colh, '' AS coli FROM dual
  UNION ALL
  SELECT 4 AS rownumber, 'test 4' AS cola, 'feb -11' AS cole, 'mar -11' AS colf, 'Total' AS colg, '' AS colh, '' AS coli FROM dual
)
-- Das eigebtliche Query
SELECT 
  rownumber, 
  cola, 
  --  'jan -11' zuerst in ein Datum wandeln und dieses dann wieder in einen Text: '201101'
  TO_CHAR(TO_DATE(col_value, 'MON -YY'), 'YYYYMM') AS my_date, 
  col_name
FROM 
  (
    SELECT 
      rownumber, 
      cola,
      col_value, 
      col_name
    FROM 
      -- Schreibe das Format um
      (
        -- cole
        SELECT rownumber, cola, cole AS col_value, 'cole' AS col_name
        FROM mydata
        -- colf
        UNION ALL
        SELECT rownumber, cola, colf AS col_value, 'colf' AS col_name
        FROM mydata
        -- colg
        UNION ALL
        SELECT rownumber, cola, colg AS col_value, 'colg' AS col_name
        FROM mydata
        -- colh
        UNION ALL
        SELECT rownumber, cola, colh AS col_value, 'colh' AS col_name
        FROM mydata
        -- coli
        UNION ALL
        SELECT rownumber, cola, coli AS col_value, 'coli' AS col_name
        FROM mydata
        ORDER BY rownumber, col_name
      ) tab
    WHERE
      -- Alle Null und Totals ausfiltern
      NOT NVL(col_value, 'Total') = 'Total'
  ) uniondataM
 
Zuletzt bearbeitet von einem Moderator:
Also wenn ich ihn richtig verstanden habe, will er per Abfrage herausfinden, in welcher Spalte das "Total" steht, und als Ergebnis will er dann eben Spalte 5 bis SpalteMitTotal-1 haben, welches dann umformatiert dargestellt werden soll.

Die Frage, die sich mir jetzt stellt, ist das nur für Zeile 3, oder für alle Zeilen in dem CSV?
 
@yaslaw
das macht schon ziemlich genau was ich mir so vorgestellt habe. vielen dank. ich werde versuchen das ganze noch generisch zu gestalten, also so, dass das select col nur einmal geschrieben werden muss und per for loop für jede spalte ausgeführt wird. ich melde mich nochmals falls ich das dann habe.

@zvoni
genau, das ist was ich wollte und das liefert der code vom kollegen ja bereits. ja das soll nur für zeile 3 des csv gemacht werden. info: das csv ist eigentlich ein excel, das konvertiert wurde. und es einthält in einer header row (=3) eben die jahres monats zahlen.
 
Zurück