Anmelden

View Full Version : Sql Null Werte



Seiten : [1] 2

tarkusch
25-07-17, 15:11
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?



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

Robi
25-07-17, 15:23
... where wert is / is not null

mehr nicht.

tarkusch
25-07-17, 16:27
Hi,

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

Fuerchau
25-07-17, 16:46
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.

tarkusch
25-07-17, 17:50
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:


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:


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.

B.Hauser
25-07-17, 18:05
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

tarkusch
25-07-17, 19:30
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?

B.Hauser
26-07-17, 06:07
Sofern es sich um echte NULL-Werte handelt, ... ja
Etwa so:


Update YourFile
set YourField = 0
Where YourField is NULL;

Birgitta

tarkusch
26-07-17, 06:53
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

Robi
26-07-17, 07:37
select hex(feld1), hex(feld2) from ...