2016-07-28 16 views
1

OS Linux Debian 5.3.1 wenn das hilft.PostgreSQL: CAST Spalte nur wenn existiert

Ich habe eine Reihe von CSV-Dateien, die ich als Tabellen in PostgreSQL importieren konnte. Sie alle haben das gleiche allgemeine Layout (d. H. Global die gleichen Spalten), jedoch variieren einige von ihnen geringfügig (d. H. Einige von ihnen können einige Spalten verpassen). Um klarer zu sein, das allgemeine Layout soll Spalten a, b, c, d, e sein, jedoch haben einige Tabellen nur Spalten a, b, d, e, andere nur Spalten b, c, d, e ...

Ich möchte eine allgemeine SQL-Abfrage zum Ändern der Art der Spalten (mit CAST) und importieren sie in einer einzigen globalen Tabelle (t_import) mit den Spalten a, b, c, d, e.

INSERT INTO t_import (a, b, c, d, e) 
    SELECT (
     (CAST a AS integer) AS a, 
     (CAST b AS character varying(14)) AS b, 
     (CAST c AS integer) AS c, 
     (CAST d AS character varying) AS d, 
     (CAST e AS character varying) AS e 
    FROM t_csv; 

jedoch, da einige Tabellen einige Spalten verpassen, sollte ich eine Abfrage für jede Tabelle erstellen, die ich importieren möchten, die zu ermüdend für die Anzahl der Tabellen würde ich habe.

Gibt es eine Möglichkeit zu überprüfen, ob die Spalte in der Tabelle, die ich importieren möchte, vorhanden ist, eine nur, wenn sie existiert, CAST it, sonst einen Standardwert verwenden? Auf diese Weise würde ich dieselbe Abfrage für meine verschiedenen Tabellen verwenden können, ohne Fehler zu bekommen.

Globally das ich, was ich tun möchte:

  • überprüfen, ob colum in der Tabelle vorhanden ich importieren möchten,
  • , wenn die Spalte vorhanden ist, CAST es in der Art Ich will und Verwendung dies für die INSERT INTO,
  • Wenn die Spalte nicht existiert, verwenden Sie einen Standardwert, so dass die INSERT INTO immer noch etwas einfügen muss und ich bekomme keine Fehlermeldung.

Nach vielen Recherchen habe ich immer noch nicht die technische Lösung gefunden. Ich kämpfe mit Parametern wie IF EXISTS, WHERE EXISTS, Sub-Abfragen ... und kann das nicht schaffen. Gibt es eine Möglichkeit, dies zu tun, oder habe ich den falschen Weg, dieses Problem zu betrachten?

+1

Sie benötigen eine Funktion, die dynamisches SQL verwendet und die Spalten z. 'information_schema.columns' –

Antwort

0

Unite die select Abfragen die Standardwerte bereitstellt:

insert into t_import (a, b, c, d, e) 

select 
    a::integer, 
    b::character varying(14), 
    c::integer, 
    d::character varying, 
    e::character varying 
from t_csv 

union all 

select 
    null, 
    a, 
    null, 
    b, 
    c 
from t2_csv 

Beachten Sie, dass die Spalten an den insert Befehl in der Reihenfolge weitergegeben werden sie unabhängig von ihrem Namen und Aliasnamen ausgewählt werden.

Von der zweiten vereinigten Tabelle auf die Spalten werden in die entsprechenden Spalten in der ersten Auswahl umgewandelt, so dass es nicht notwendig ist, explizit zu casten.