View Full Version : NULL und Case
Allrounder
08-05-12, 15:19
Folgendes Phänomen:
Ich möchte eine Spalte (char, NULLABLE) einer SQL-Tabelle per SQL auf NULL setzen.
Egal ob embedded im RPG-Programm oder interaktiv, der Effekt ist der Gleiche:
Ein direktes updaten (update tabelle set spalte = NULL where ...) funktioniert.
Bau ich in das SQL-Statement einen CASE ein, funktioniert es nicht mehr:
update tabelle set spalte = (case when :hostvar > ' ' then :hostvar else NULL end) where ...
oder
update tabelle set spalte = NULLIF(:hostvar, ' ') where ...
In beiden Beispielen werden Leerzeichen statt NULL in die Spalte geschrieben.
Hat jemand eine Erklärung parat?
andreaspr@aon.at
08-05-12, 15:26
Ich schätze es liegt an den Wert in deiner Hostvariable.
Schreib mal lieber
case when :hostvar <> ' '
Folgendes liefert mir wie gewollt NULL:
select case when ' ' > ' ' then 'xx' else null end
from sysibm/sysdummy1
lg Andreas
Allrounder
08-05-12, 15:52
Danke für die Antwort.
... Schreib mal lieber
case when :hostvar <> ' ' ...
Hat leider nichts gebracht.
Interaktiv in der SQL-Konsole ohne Hostvariable wird auch kein NULL geschrieben.
Folgendes liefert mir wie gewollt NULL:
select case when ' ' > ' ' then 'xx' else null end
from sysibm/sysdummy1
Bei mir auch. Hilft mir aber leider auch nicht weiter.
Andere Ideen?
Allrounder
08-05-12, 15:56
Ergänzend zur Erläuterung:
Interaktiv schreibt er hier Leerzeichen statt NULL:
update tabelle set Spalte = (case 1 when 1 then NULL else 'xx' end) where ...;
Für NULL-Werte benötigt man NULL-Anzeiger.
Diese dienen nicht nur zum Lesen sondern auch zum schreiben:
D MyVar 10
d MyVarNull 5I 0
if MyVar = *blank;
MyVarNull = -1; // NULL setzen
else;
MyVarNull = 0;
endif;
exec sql update mytable
set MyField = : MyVar : MyVarNull, MyField2 ...
where ...
...;
Zu beachten ist halt, dass für jede NULL-mögliche Spalte ein NULL-Anzeiger benötigt wird.
Ansonsten prüfe mal die Tabelle (DSPFFD) ob das Feld tatsächlich NULL erlaubt (ALLOWNULL).
Allrounder
08-05-12, 16:09
NULL-Anzeiger brauche ich in dem Fall nicht, da ich den NULL-Wert nicht in der Hostvariable brauche.
andreaspr@aon.at
08-05-12, 16:12
Ich glaube das Problem ist in der Host-Variable zu finden.
Schreibe mal vor deinem Update
hostvar = ' ';
Und wenn dann immer noch nicht NULL steht, wäre der SQLSTATE interessant.
Woran siehst du, daß da Leerzeichen und nicht NULL reingeschrieben wurden?
Bitte um Entschuldigung, aber NULL-Anzeiger werden zum korrekten Schreiben wirklich gebraucht.
Alle anderen Varianten kosten nur Zeit und sind nicht eindeutig zumal BLANK auch nicht NULL ist.
Deshalb ist der NULL-Anzeiger auch eine eigene Variable und muss im SQL auch separat angegebne werden.
Deine Hostvariable ist davon unberührt.
Spätesten wieder beim Lesen benötigst du sinnvollerweise wieder den NULL-Anzeiger, wenn du allerdings beim Select wieder coalesce verwendest kannst du dir das mit dem NULL-Wert auch schenken.
Allrounder
08-05-12, 16:31
Ich glaube das Problem ist in der Host-Variable zu finden.
Schreibe mal vor deinem Update
hostvar = ' ';
Und wenn dann immer noch nicht NULL steht, wäre der SQLSTATE interessant.
Hat leider nichts gebracht.
Habe zwischenzeitlich die Hostvariable komplett rausgenommen:
exec sql update Tabelle
set Spalte =
(case
when 1=2
then 'xx'
else NULL
end)
where ...;
Schreibt auch kein NULL. sqlcod und sqlstate sind 0.