-
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
-
... where wert is / is not null
mehr nicht.
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Hi,
das hätte ich schon in der Where Klausel probiert.
Bekomme dann wieder die Meldung: Auswahlfehler für Feld OLDKDN
-
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.
-
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.
-
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
-
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?
-
Sofern es sich um echte NULL-Werte handelt, ... ja
Etwa so:
Code:
Update YourFile
set YourField = 0
Where YourField is NULL;
Birgitta
-
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
-
select hex(feld1), hex(feld2) from ...
Das Notwendige steht über dem technisch machbaren.
(klingt komisch, funktioniert aber!)
-
Danke an alle,
ich habe es nun so upgedatet:
update myfile
set oldKDN = 0
where hex(oldKDN) = '404040'
lg
-
Warum soll ein Vergleich mit VARCHAR(NumWert) besser sein?
Damit verhindert man jedweden Indexzugriff, es sei denn man benutzt ebenso einen kalkulierten Index.
Similar Threads
-
By cicero22 in forum IBM i Hauptforum
Antworten: 12
Letzter Beitrag: 03-09-14, 18:45
-
By alexk2013 in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 14-05-14, 12:33
-
By hs in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 31-01-14, 11:49
-
By Sigma in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 23-04-03, 13:48
-
By KB in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 18-05-01, 15:04
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks