PDA

View Full Version : Nullwerte für Spalte oder Variable nicht zulässig.



Seiten : [1] 2

tarkusch
11-10-12, 13:02
Hallo,
bekomme bei dieser Sqlabfrage die Meldung:Nullwerte für Spalte oder Variable nicht zulässig.


INSERT INTO QTEMP/$FILE (P1FIR, P1KST, P2ZLM, P2ADM, P2TKM,
P2LFD#)
SELECT XX.F1ABT, XX.F1KST, XX.ZUDAT, XX.ABDAT, XX.ZUTKM, 0
AS Nummer FROM ZGNP XX WHERE NOT EXISTS( SELECT * FROM $FILE
YY WHERE XX.F1ABT= YY.P1FIR AND XX.F1KST = YY.P1KST) AND
(XX.ZUDAT <> 0 AND substr(digits(XX.ZUDAT), 1, 6) <= 201210 ) AND
substr(digits(XX.ABDAT), 1, 6) >= 201210 ORDER BY F1ABT, F1KST,
ZUDAT


Das untere Statement mit dem Select wird korrekt angezeigt:
SELECT XX.F1ABT, XX.F1KST, XX.ZUDAT, XX.ABDAT, XX.ZUTKM, 0
AS Nummer FROM ZGNP XX WHERE NOT EXISTS( SELECT * FROM $FILE
YY WHERE XX.F1ABT= YY.P1FIR AND XX.F1KST = YY.P1KST) AND
(XX.ZUDAT <> 0 AND substr(digits(XX.ZUDAT), 1, 6) <= 201210 ) AND
substr(digits(XX.ABDAT), 1, 6) >= 201210 ORDER BY F1ABT, F1KST,
ZUDAT

Die Felder im Insert sind ident mit denen des Select.

Wo liegt hier der Fehler begraben?

Gruß

Tarki

Fuerchau
11-10-12, 13:08
Was man halt bei der Selectausgabe ggf. nicht sofort erkennen kann ist das Vorkommen von NULL.
Dies wird in der Ausgabe dann durch " - " dargestellt.

Per DSPFFD kannst du prüfen, ob auf einem der Quellfelder ALWNULL definiert ist, in diesem Fall gibt es 2 Möglichkeiren:

- definiere in deiner Zieltabelle das feld ebenso als ALWNULL
- mach einen select ... coalesce(Feld, Defaultkonstante) ...

ExAzubi
11-10-12, 14:16
Ggf. bei den Spalten der SELECT-Abfrage mit VALUE arbeiten. Das hat den Vorteil, das wenn eine Spalte NULL enthält, dieses einen sauberen Wert zurück gibt.

SELECT VALUE(SPALTE1, 0) ....

Enthält das Feld Spalte1 NULL wird die 0 zurückgegeben.

tarkusch
11-10-12, 14:30
Was man halt bei der Selectausgabe ggf. nicht sofort erkennen kann ist das Vorkommen von NULL.
Dies wird in der Ausgabe dann durch " - " dargestellt.

Per DSPFFD kannst du prüfen, ob auf einem der Quellfelder ALWNULL definiert ist, in diesem Fall gibt es 2 Möglichkeiren:

- definiere in deiner Zieltabelle das feld ebenso als ALWNULL
- mach einen select ... coalesce(Feld, Defaultkonstante) ...

Muss ich das beim 1. Select oder 2. Select coalesce angeben?

B.Hauser
11-10-12, 14:33
Ggf. bei den Spalten der SELECT-Abfrage mit VALUE arbeiten. Das hat den Vorteil, das wenn eine Spalte NULL enthält, dieses einen sauberen Wert zurück gibt.

SELECT VALUE(SPALTE1, "leer") ....

Enthält das Feld Spalte1 NULL wird der String leer zurückgegeben.

Worin glaubst Du liegt wohl der Unterschied zwischen COALESCE, IFNULL und VALUE???

Birgitta

andreaspr@aon.at
11-10-12, 14:36
Muss ich das beim 1. Select oder 2. Select coalesce angeben?

Beim 1. Select, denn von diesem werden die Werte der Spalten in die Tabelle geschrieben.
Die Spalten aus dem 2. Select (vom NOT EXISTS...) werden für die weitere Verarbeitung nicht verwendet.

lg Andreas

B.Hauser
11-10-12, 14:36
Muss ich das beim 1. Select oder 2. Select coalesce angeben?

... im 1., d.h. bei der Auflistung der Felder, da deren Inhalt in die Ziel-Tabelle geschrieben wird. Der Select im NOT EXISTS wird nur zur Prüfung verwendet.

Birgitta

Fuerchau
11-10-12, 15:13
Beim Select den du im Insert verwendest.

VALUE ist eine IBM-spezifische funktion die durch SQL-Standard dann als COALESCE definiert wurde.

VALUE und COALESCE erlauben mehrere Werte, IFNULL erlaubt nur genau 2 Werte und ist auch erst durch eine spätere SQL-Norm dazugekommen.

BenderD
11-10-12, 15:41
... das würde ich mal bleiben lassen, mit lockerer Hand die sauberen Nullvalues durch Schmuddelwerte, egal welcher Art zu ersetzen, da kann Quark bei rauskommen!!! Das hat ja vielleicht einen Grund, warum da Nullwerte zugelassen sind!!!

D*B

Fuerchau
11-10-12, 16:32
Naja, manchmal auch nur aus Unkenntnis :).