muss mich jetzt mehr mit Postgres beschäftigen und komme daher auf folgendes Problem:
In einer Tabelle (Befund) befinden sich u.a. 4 Spalten mit den Bezeichnungen laenge_von, laenge-bis, breite_von und breite_bis.
Die Daten wurden von einer ACCESS-Datenbank übernommen; leider sind die Tabellenfelder alphanumerisch und so ist in den von_Tabellenfeldern meistens der komplette von-bis-Wert in der Form xxx - xxx bzw. xxx-xxx enthalten; die bis_Spalte ist dagegen leer.
Gibt es unter POSTGRES die Möglichkeit, das Von-Feld aufzusplitten und die Werte richtig in die zugehörigen Felder einzutragen oder muss man das mühselig per Hand erledigen?
Habe das Forum schon durchsucht, aber nichts darüber gefunden.
Das ist nicht PostgreSQL-spezifisch, sondern hat was mit Datentypen und Datenkonsistenz zu tun. Wenn Spielzeuge wie M$-Access jeden Datenmüll annehmen, so ist das deren Sache. Welche Probleme mit dem Umgang später auftreten, erlebst Du gerade.
Zu Deinem Problem:
offensichtlich mag er kein Leerzeichen für einen numerischen Wert annehmen - es ist ja auch kein numerischer Wert. Also eliminiere die Leerzeichen aus dem String. Wenn der String dann leer ist, dann kannst Du den nicht zu numeric casten. Beispiel:
Die Tabelle enthält in der Spalte s Leerzeichen und einmal auch eine 1 mit Leerzeichen. Damit man dies sieht, zeige ich in der zweiten Spalte extra ein ‘x’ vorn/hinten mit an. In der dritten Spalte caste ich nach numeric, sofern möglich.
test=*# select s, 'x'||s||'x', case when length(trim(both ' ' from s)) > 0 then trim(both ' ' from s)::numeric else null end from n;
s | ?column? | case
------+----------+------
| x x |
| x x |
1 | x 1 x | 1
(3 Zeilen)
Bei Problemen wie bei Dir ist es ratsam, die Daten zuerst einmal in eine Import-Tabelle zu holen, deren Spalten vom Typ TEXT sind. Dann bastelt man sich halt ein passendes SQL-Select, und wenn das stimmt und alles klappt, füllt man die eigentliche Zieltabelle damit.
aus der doku
If the ELSE clause is omitted and no condition matches, the result is null.
dir fehlt das ELSE im case?
oder verwende doch einfach zwi_tab = CoalEsce(zwi_tab, ‘0’)
ausserdem weiss ich nicht wie du danach auf die null-felder selektierst … ich bin mir nicht sicher aber feld = NULL wird wohl false sein, auch wenn das feld NULL ist … weil NULL = NULL false ist … du solltest mit feld IS NULL prüfen … dann wirst du die NULLs auch sehen
den gleichen “fehler” machst du schon oben im CASE
Do not write expression = NULL because NULL is not “equal to” NULL. (The null value represents an unknown value, and it is not known whether two unknown values are equal.) This behavior conforms to the SQL standard.