Beim Umgang mit SQL ist die Behandlung von NULL Werten von zentraler Bedeutung. In PostgreSQL bezeichnen NULL-Werte ein Feld, dessen Inhalt 'undefiniert' ist. Dabei ist besonders hervorzuheben, dass NULL keinesfalls einem Leerstring respektive der Zahl 0 entspricht. NULL hat einen Sonderstatus - das sollte man sich bei jeder Operation immer wieder vor Augen führen.
Fügen wir einen Datensatz ein, der einen NULL-Wert enthält:
test=# INSERT INTO t_person VALUES ('34567', NULL);
INSERT 4900004 1
Um den Wert zu finden, müssen wir 'IS NULL' verwenden:
test=# SELECT * FROM t_person WHERE name IS NULL; svnr | name -------+------ 34567 | (1 row)
Oft versuchen Programmierer fälschlicherweise einen leeren String zu suchen und denken, dass so NULL Werte wiedergefunden werden können. Das funktioniert bei PostgreSQL allerdings nicht:
test=# SELECT * FROM t_person WHERE name = ''; svnr | name ------+------ (0 rows)
In Oracle sieht die Situation etwas anders aus: NULL Werte sind gleichbedeutend mit leeren Strings - es wird daher nicht zwischen Leerstring und NULL unterschieden. Bei Oracle Migrationen macht das oft Probleme und bestehende Applikationen funktionieren nicht mehr richtig.
Oft wird auch versucht, NULL Werte wie normale Felder abzufragen:
test=# SELECT * FROM t_person WHERE name = NULL; svnr | name ------+------ (0 rows)
Auch das schlägt fehl, da diese Syntax nicht dem gängigen SQL Standard folgt. Wenn Sie dennoch wollen, dass PostgreSQL '= NULL' sinnvoll auswertet, können Sie einen Laufzeitparameter aktivieren:
test=# SET transform_null_equals TO on; SET test=# SELECT * FROM t_person WHERE name = NULL; svnr | name -------+------ 34567 | (1 row)
'transform_null_equals' stellt sicher, dass NULL-Werte etwas anders behandelt werden. Defaultmäßig ist die Transformation von NULL-Werten auch ausgeschaltet und PostgreSQL stellt so sicher, dass Benutzer angehalten werden, sich an den SQL Standard zu halten.
Wenn Sie die Transformation wieder unterbinden wollen, können Sie wie folgt vorgehen:
test=# SET transform_null_equals TO off; SET