[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Thema: NULL und Case

Hybrid View

  1. #1
    Registriert seit
    Oct 2003
    Beiträge
    117

    NULL und Case

    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:

    Code:
    update tabelle set spalte = (case when :hostvar > ' ' then :hostvar else NULL end) where ...
    oder

    Code:
    update tabelle set spalte = NULLIF(:hostvar, ' ') where ...
    In beiden Beispielen werden Leerzeichen statt NULL in die Spalte geschrieben.

    Hat jemand eine Erklärung parat?

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Ich schätze es liegt an den Wert in deiner Hostvariable.

    Schreib mal lieber
    Code:
    case when :hostvar <> ' '
    Folgendes liefert mir wie gewollt NULL:
    Code:
    select case when ' ' > ' ' then 'xx' else null end
    from sysibm/sysdummy1
    lg Andreas

  3. #3
    Registriert seit
    Oct 2003
    Beiträge
    117
    Danke für die Antwort.

    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    ... Schreib mal lieber
    Code:
    case when :hostvar <> ' '
    ...
    Hat leider nichts gebracht.
    Interaktiv in der SQL-Konsole ohne Hostvariable wird auch kein NULL geschrieben.

    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    Folgendes liefert mir wie gewollt NULL:
    Code:
    select case when ' ' > ' ' then 'xx' else null end
    from sysibm/sysdummy1
    Bei mir auch. Hilft mir aber leider auch nicht weiter.

    Andere Ideen?

  4. #4
    Registriert seit
    Oct 2003
    Beiträge
    117
    Ergänzend zur Erläuterung:

    Interaktiv schreibt er hier Leerzeichen statt NULL:

    Code:
    update tabelle set Spalte = (case 1 when 1 then NULL else 'xx' end) where ...;

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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).
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  6. #6
    Registriert seit
    Oct 2003
    Beiträge
    117
    NULL-Anzeiger brauche ich in dem Fall nicht, da ich den NULL-Wert nicht in der Hostvariable brauche.

  7. #7
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Ich glaube das Problem ist in der Host-Variable zu finden.
    Schreibe mal vor deinem Update
    Code:
    hostvar = ' ';
    Und wenn dann immer noch nicht NULL steht, wäre der SQLSTATE interessant.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  9. #9
    Registriert seit
    Oct 2003
    Beiträge
    117
    Zitat Zitat von Fuerchau Beitrag anzeigen
    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.
    Du merkst sicher, dass ich kein Freund von NULL-Anzeigern bin ;-). Bisher sind wir immer ohne ausgekommen. Beim Lesen verwenden wir coalesce.

  10. #10
    Registriert seit
    Oct 2003
    Beiträge
    117
    Zitat Zitat von andreaspr@aon.at Beitrag anzeigen
    Ich glaube das Problem ist in der Host-Variable zu finden.
    Schreibe mal vor deinem Update
    Code:
    hostvar = ' ';
    Und wenn dann immer noch nicht NULL steht, wäre der SQLSTATE interessant.
    Hat leider nichts gebracht.
    Habe zwischenzeitlich die Hostvariable komplett rausgenommen:

    Code:
    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.

  11. #11
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Woran siehst du, daß da Leerzeichen und nicht NULL reingeschrieben wurden?

  12. #12
    Registriert seit
    Oct 2003
    Beiträge
    117
    Zitat Zitat von Pikachu Beitrag anzeigen
    Woran siehst du, daß da Leerzeichen und nicht NULL reingeschrieben wurden?
    Bei NULL wird ein '-' angezeigt.

Similar Threads

  1. dynamisches Group by funktioniert nicht
    By Tobse77 in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 24-09-09, 08:31
  2. Darstellung der Null im LPEX-Editor (WDSC)
    By Ewald in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 25-01-07, 07:52
  3. Subselect in case when auf DB2/400
    By Flo4711 in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 29-09-06, 17:31
  4. NOT NULL WITH DEFAULT
    By deni87991 in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 04-08-06, 10:32
  5. Cobol-Programm mit Embedded SQL (SELECT CASE)
    By klausgkv in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 08-06-06, 13:47

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •