Hallo Leute, ich lass’ Euch keine Ruhe…
Irgendwie raff ich’s nicht, folgendes Problem:
Um Daten zu importieren habe ich mir einen Tabell angelegt, alle Felder sind TEXT (mit VARCHAR() hab ich’s auch probiert). Die Daten sollen nun in die Zieltabelle eingefügt/aktualisiert werden, wobei die Spalten der Zieltabelle mit BOOLEAN, INTEGER etc. deklariert sind.
CREATE OR RPLACE FUNCTION....
DECLARE
rec RECORD;
out RECORD;
BEGIN
SELECT INTO rec * FROM src_table; --ALLE Felder TEXT, bis auf Prim. Key
INSERT INTO dest_table(Feld1,Feld2,..,Feldn) VALUES(rec.FELD1,rec.Feld2,..,Feldn) RETURNING id INTO out;
[..]
UPDATE dest1_table SET Feld1=rec.Feld1 WHERE id=out.id;
RETURN;
END;
Blöderweise kann der Datentyp TEXT nicht in INTEGER, BOOLEAN oder DATE konvertiert werden. Also hab’ ich’s mit expliziten CAST’s versucht, aber nichts hat funktioniert: weder CAST(rec.Feld1 AS BOOLEAN) noch BOOLEAN(rec.Feld1) oder rec.Feld1::BOOLEAN.
Beim Einfügen in die Importtabelle sorgt ein Trigger dafür, dass die Daten umwandlungsfähig sind, also dass z.B. im BOOLEAN-Feld 0,f oder false drinsteht.
Was habe ich übersehen?
(Meine Kollegen winseln schon, ich solle MySQL nehmen)
(Meine Kollegen winseln schon, ich solle MySQL nehmen)
Und, machst Du es? Hätte viele Vorteile: es gibt einen 29.02.2007, für highspeed-Anwendungen die Blackhole-Stogare-Engine und für referntielle Integrität PHP.
Okay, genug jetzt…
Also, das geht schon, für BOOL:
test=# select * from foo;
t | b
---+---
1 |
0 |
t |
f |
a |
b |
c |
(7 rows)
test=*# select * from foo2;
t | b
---+---
(0 rows)
test=*# insert into foo2 select t, case when t ~ '[1t]' then 't'::bool when t ~ '[0f]' then 'f'::bool end from foo;
INSERT 0 7
test=*# select * from foo2;
t | b
---+---
1 | t
0 | f
t | t
f | f
a |
b |
c |
(7 rows)
Für DATE gibt es eine Funktion to_date. Für INT sollte es trivial sein, das geht einfach zu casten.
CASE WHEN…
Da hätte ich nie dran gedacht…
Vielen Dank
Ich arbeite BTW nicht mit PHP (dann hätte ich evtl. MySQL in Erwägung gezogen), sondern mit Delphi. Ich musste mal einen Datenübernahme-Client schreiben, von MySQL zum Orakel. Seitdem vermeide ich MySQL wenn möglich.