PDA

View Full Version : NULL und Case



Seiten : [1] 2 3 4

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 ...;

Fuerchau
08-05-12, 16:03
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.

Pikachu
08-05-12, 16:18
Woran siehst du, daß da Leerzeichen und nicht NULL reingeschrieben wurden?

Fuerchau
08-05-12, 16:20
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.