[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2012
    Beiträge
    360

    Sql Null Werte

    Hallo,

    ich habe mir eine Datei erstellt, wo ich Kundennummer Vorkommen(Dateinname/Feldname/Art (Dec/char)) erfasst habe.

    Diese lese ich native durch und stoppel mir Sql-Statement zusammen.
    Das Feld OLDKDN ist 6, 0 und einige Werte sind in der Datenbank null
    Wie muss ich hier die Funktion ifnull oder coalesce einsetzen bzw. wie kann ich die Nullwerte ausschließen?

    Code:
    SELECT char(OLDKDN) FROM MYFILE A 
    WHERE exists (select * from KUNDENP P where dec(A.OLDKDN , 13, 0) = P.KDNNR ) 
    GROUP BY char(OLDKDN)
    Dank im Voraus

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.973
    ... where wert is / is not null

    mehr nicht.
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  3. #3
    Registriert seit
    Apr 2012
    Beiträge
    360
    Hi,

    das hätte ich schon in der Where Klausel probiert.
    Bekomme dann wieder die Meldung: Auswahlfehler für Feld OLDKDN


  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Das liegt an der neuen Optiomierungsstrategie, dass die Reihenfolge der Interpretation nicht mehr gewährleistet ist.
    Man muss sich nun verstärkt der Aussage widmen:
    Ist ein Teilausdruck NULL, dann ist der Gesamtausdruck NULL.
    In deinem Fall kann ich im Moment eigentlich nichts erkennen.
    Schalte mal den Debugmodus ein, dann wird der eigentliche Ausdruck (ggf. optimiert) ausgeworfen, wo der Fehler liegt.

    Evtl. ist das Feld OLDKDN nicht NULL sondern Blank, dann fällt der DEC(...) auf die Schnautze.
    Hier wäre dann Nullif(OLDKDN, ' ') erforderlich.
    Andererseits verstehe ich dann die CHAR(OLDKDN) nicht.
    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

  5. #5
    Registriert seit
    Apr 2012
    Beiträge
    360
    OLDKDN ist in diesem Fall Numerisch.

    ich habe mir eine Datei erstellt, wo in den Sourcen die Kundennummer vorkommt.
    Manchmal kommt Sie Numerisch, manchmal auch Alpha.

    Die Längen variieren auch zwischen 5, 0 bis 13, 0 und das selbe im Alpha-bereich.
    Datei:
    Code:
    Feld               Datei             Art                   Länge  
    "SOURCE"           KNDRSLT           CHARACTER                20        
    TEILDATEI          KNDRSLT           CHARACTER                10        
    TEXT               KNDRSLT           CHARACTER                50        
    FELDNAME           KNDRSLT           CHARACTER                10        
    FELDLAENGE         KNDRSLT           CHARACTER                10        
    INFOTEXT           KNDRSLT           CHARACTER                30        
    TSTMP              KNDRSLT           TIMESTAMP
    Im Programm stopple ich folgendes Sqlstatement zusammen:
    Code:
    TEXT = %trim(%XLATE(HK:HK1:TEXT));
    
    
    SqlQry = 'INSERT INTO STATISTIK +
    SELECT char(' + %TRIM(FELDNAME) + '), +
    min(' + HK + %TRIM(SOURCE)     + HK + '), +
    min(' + HK + %TRIM(TEILDATEI)  + HK + '), +
    min(' + HK + %TRIM(TEXT)       + HK + '), +
    min(' + HK + %TRIM(FELDNAME)   + HK + '), +
    min(' + HK + %TRIM(FELDLAENGE) + HK + '), +
    COUNT(*), +
    min(' + HK + %TRIM(INFOTEXT) + HK + '), ' +
    %CHAR(SQLCOD)                             +
    ' from ' + %TRIM(TEILDATEI) + ' A ';
    
    
    IF %SCAN('A':FELDLAENGE) = *ZEROS;
      // Feld Numerisch
      SqlQry = %TRIMR(SqlQry) +
      ' WHERE exists +
      (select * from KUNDENP P +
      where dec(A.' + FELDNAME + ', 13, 0) = P.KDNNR)';
    ELSE;
      // Feld Alpha
      SqlQry = %TRIMR(SqlQry) +
      ' WHERE exists +
      (select * from KUNDENP P +
      where A.' + FELDNAME + ' = CHAR(P.KDNNR))';
    ENDIF;
    
    
    
    
    SqlQry = %TRIMR(SqlQry) +
    ' group by char(' + %TRIM(FELDNAME) + ')';
    
    
    Exec SQL
       execute immediate :SqlQry;     
    
    INSERT INTO STATISTIK              
        SELECT char(OLDKDN), ... 
        FROM MYFILE A 
        WHERE exists (select * from KUNDENP P 
                      where dec(A.OLDKDN , 13, 0) = P.KDNNR ) 
        GROUP BY char(OLDKDN)
    Hoffe es erklärt zu haben.

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Ist denn die Spalte OLDKDN auch tatsächlich NULL-fähig?
    Ich vermute eher, dass in dem Feld kein NULL-Wert, sondern ungültige numerische Werte (z.B. Blanks) stehen. Schau Dir mal die Hex-Werte an.
    In diesem Fall müssten zunächst die ungültigen numerischen Werte korrigiert werden, bevor Dein SQL richtig funktionieren kann.

    Vielleicht noch 2 Anmerkungen:
    1. Man sollte niemals eine Variable in einem embedded SQL mit SQL anfangen lassen. Diese Variablen hat IBM sich für den PreCompiler (SQLCA und SQLDA und sonst. Variablen) reserviert. Selbst wenn Du heute noch keine Probleme hast könnte IBM mit dem nächsten Release eine Variable SQLQRY in die Communications oder Descriptlor-Area einfügen, und dann ?
    2. Für den Vergleich ist es besser die numerischen Felder in alphanumerische zu konvertieren am besten mit VARCHAR anstatt CHAR. Bei CHAR wird mit Blanks auf die volle Länge aufgefüllt. Bei VarChar wird nur die Zahl linksbündig ausgerichtet ohne folgende Blanks ausgegeben.

    Sollte es sich tatsächlich um einen NULL-Wert handeln, kannst Du diesen auch mit Hilfe der Funktion COALESCE in einen Default-Wert z.B. 0 konvertieren.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  7. #7
    Registriert seit
    Apr 2012
    Beiträge
    360
    Liebe Birgitta,

    danke für die Anmerkungen, war mir leider nicht so bewusst.

    Bisher habe ich null-Werte in der Datenbank mit upddta manipuliert.

    Ginge das auch mit Sql damit ich die Werte mit einem Update auf 0 setzten kann?



  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Sofern es sich um echte NULL-Werte handelt, ... ja
    Etwa so:

    Code:
    Update YourFile
         set YourField = 0
    Where YourField is NULL;
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Apr 2012
    Beiträge
    360
    Hallo,

    das Feld ist nachträglich hinzugefügt worden.
    Aber sicher ein schreibendes Programm nicht kompeliert worden.

    Was ist eigentlich ein echter Null-Wert?
    Der oben beschriebene Fall?

    Wie schaut ihr die Hex-Werte an? Mit DSPPFM?

    lg

  10. #10
    Registriert seit
    Jun 2001
    Beiträge
    1.973
    select hex(feld1), hex(feld2) from ...
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  11. #11
    Registriert seit
    Apr 2012
    Beiträge
    360
    Danke an alle,

    ich habe es nun so upgedatet:

    update myfile
    set oldKDN = 0
    where hex(oldKDN) = '404040'

    lg

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Warum soll ein Vergleich mit VARCHAR(NumWert) besser sein?
    Damit verhindert man jedweden Indexzugriff, es sei denn man benutzt ebenso einen kalkulierten Index.
    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

Similar Threads

  1. NULL Felder / CPYTOIMPF
    By cicero22 in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 03-09-14, 19:45
  2. UPDDTA und Null-Werte
    By alexk2013 in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 14-05-14, 13:33
  3. SQL IS nOT NULL funktioniert nicht auf V7.1
    By hs in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 31-01-14, 12:49
  4. Antworten: 5
    Letzter Beitrag: 23-04-03, 14:48
  5. Virtuelle Spalten im VIEW auf NULL
    By KB in forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 18-05-01, 16:04

Berechtigungen

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