SQL auf AS400 if-Abfrage in WHERE?
Hallo zusammen,
ich habe ein Problem mit einem SQL-Statement, per iSeries Navigator auf einer AS400 abgesetzt, und zwar brauche ich sinngemäß eine if-Abfrage im WHERE-Teil.
Das Problem ist folgendes: Es sollen nur Datensätze gefunden werden, die in DATAUSMTG entweder 0 stehen haben oder ein Datum, das größer ist als das heutige Datum.
Nachdem ich nun schon eine Weile verzweifelt gegoogelt und einige Foren durchforscht habe, hoffe ich, hier kann mir jemand helfen.
Mein WHERE-Teil sieht zur Zeit (gekürzt auf die relevante Stelle) so aus:
Solange in DATAUSMTG ein Datum steht, funktioniert das bestens. Steht dort aber 0, fällt das OR auf die Nase. Klar, da aus 0 kein Datum gebaut werden kann.
Ich dachte eigentlich, dass durch die Klammersetzung der hintere Teil des OR einfach ignoriert wird, aber dem ist wohl nicht so.
Hat jemand eine Idee?
Danke schon mal und Gruß
Jutta
ich habe ein Problem mit einem SQL-Statement, per iSeries Navigator auf einer AS400 abgesetzt, und zwar brauche ich sinngemäß eine if-Abfrage im WHERE-Teil.
Das Problem ist folgendes: Es sollen nur Datensätze gefunden werden, die in DATAUSMTG entweder 0 stehen haben oder ein Datum, das größer ist als das heutige Datum.
Nachdem ich nun schon eine Weile verzweifelt gegoogelt und einige Foren durchforscht habe, hoffe ich, hier kann mir jemand helfen.
Mein WHERE-Teil sieht zur Zeit (gekürzt auf die relevante Stelle) so aus:
'.' | Substr(digits(DATAUSMTG),5,2) | '.' |
Solange in DATAUSMTG ein Datum steht, funktioniert das bestens. Steht dort aber 0, fällt das OR auf die Nase. Klar, da aus 0 kein Datum gebaut werden kann.
Ich dachte eigentlich, dass durch die Klammersetzung der hintere Teil des OR einfach ignoriert wird, aber dem ist wohl nicht so.
Hat jemand eine Idee?
Danke schon mal und Gruß
Jutta
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 46700
Url: https://administrator.de/forum/sql-auf-as400-if-abfrage-in-where-46700.html
Ausgedruckt am: 01.05.2025 um 23:05 Uhr
7 Kommentare
Neuester Kommentar
Hm,
nicht, dass ich verstehen würde, was da schräg läuft, aber umformen könnten wir es...
Date(now(), ISO) bzw. bei mir Date(current date, ISO) liefert das Datum im Format 2006-12-14.
char(davon)-----> '2006-12-14' (Char)
replace(char(davon),"-", "" ) -------->'20061214' (Char)
int(replace(char(davon),"-","")) --------> 20061214 (integer)
HTH
Biber
nicht, dass ich verstehen würde, was da schräg läuft, aber umformen könnten wir es...
...
WHERE ( DATAUSMTG = 0
OR
DATAUSMTG > Int(replace(char(date(now()), ISO),'-','')) )
Date(now(), ISO) bzw. bei mir Date(current date, ISO) liefert das Datum im Format 2006-12-14.
char(davon)-----> '2006-12-14' (Char)
replace(char(davon),"-", "" ) -------->'20061214' (Char)
int(replace(char(davon),"-","")) --------> 20061214 (integer)
HTH
Biber
sorry, leanderchen,
so genau hab ich den Umfang der Skalar-Funktionen der AS400 nicht im Kopf.
Wusste nicht, dass REPLACE() nicht dabei ist...
Also bitte auch die folgende Alternative erstmal nur als Skizze nehmen:
Falls die AS400 auch den Parameter "ISO" bei der DATE()-Function nicht kennt, dann bitte den Wert der Function Date(now()) so nehmen wie er ist und -sollte er im EUR-Format kommen, die Substr()-Arie von Konvertiere-YYYY-MM-DD-nach-Integer auf Konvertiere-TT.MM.JJJJ-nach-Integer umdrehen.
Ich würde aber auf jeden Fall den (gültigen) Date(now())-Wert nach Integer konvertieren statt zu versuchen, den ungeprüften DATAUSMTG-Wert in ein Datum umzuwandeln.
HTH
Biber
[Edit]
Da haben wir über Kreuz getippt--- vergiss es einfach
[/Edit]
so genau hab ich den Umfang der Skalar-Funktionen der AS400 nicht im Kopf.
Wusste nicht, dass REPLACE() nicht dabei ist...
Also bitte auch die folgende Alternative erstmal nur als Skizze nehmen:
...WHERE (
DATAUSMTG = 0
OR
DATAUSMTG > Int(Substr(char(date(now()), ISO),'-',''), 1, 4) ||
Substr(char(date(now()), ISO),'-',''), 6, 2) ||
Substr(char(date(now()), ISO),'-',''), 9, 2))
)
Falls die AS400 auch den Parameter "ISO" bei der DATE()-Function nicht kennt, dann bitte den Wert der Function Date(now()) so nehmen wie er ist und -sollte er im EUR-Format kommen, die Substr()-Arie von Konvertiere-YYYY-MM-DD-nach-Integer auf Konvertiere-TT.MM.JJJJ-nach-Integer umdrehen.
Ich würde aber auf jeden Fall den (gültigen) Date(now())-Wert nach Integer konvertieren statt zu versuchen, den ungeprüften DATAUSMTG-Wert in ein Datum umzuwandeln.
HTH
Biber
[Edit]
Da haben wir über Kreuz getippt--- vergiss es einfach
[/Edit]