CASE in where Bedingung

JudAD

Fleissiger Benutzer
Beiträge
71
Hallo Zusammen,

ich stehe mal wieder auf dem Schlauch und finde keine Lösung.

Ich muss für eine Auswertung ein Script erstellen dass bis auf den letzten Teil in Fett ganz gut funktioniert.

Die Bedingungen im ersten Teil der where-Klausel werden dynamisch vom Programm geliefert. In Abhängigkeit von der Bedingung "beas_ftapl.pos_id =" sollen nur bestimmte Datensätze angezeigt werden.

Ist die Bedingung beas_ftapl.pos_id = 10 dann sollen alle Datensätze angezeigt werden die im Feld "beas_ftstl.aplanpos_id" entweder eine 10 oder NULL stehen haben. Ist die Bedingung z.B. beas_ftapl.pos_id = 20 (oder ein Wert != 10) dann dürfen nur Datensätze angezeigt werden die im Feld beas_ftstl.aplanpos_id eine 20 (oder die entsprechende Zahl != 10) stehen haben.

select beas_ftstl.belnr_id, beas_ftstl.belpos_id, beas_ftapl.pos_id, beas_ftpos.itemcode, beas_ftstl.art1_id, oitm.ItemName, beas_ftstl.aplanpos_id
from beas_ftstl
join beas_ftpos on beas_ftstl.belnr_id = beas_ftpos.belnr_id and beas_ftstl.belpos_id = beas_ftpos.belpos_id
join beas_ftapl on beas_ftstl.belnr_id = beas_ftapl.belnr_id and beas_ftstl.belpos_id = beas_ftapl.belpos_id
join oitm on beas_ftstl.art1_id = oitm.ItemCode
where beas_ftstl.belnr_id = '113019' and beas_ftstl.belpos_id = '10' and beas_ftapl.pos_id = '10'
and (beas_ftstl.aplanpos_id =
case
when beas_ftapl.pos_id = '10' then (NULL or '10')
else beas_ftapl.pos_id
end)

Wie könnte ich das lösen?

Danke vorab
 
Werbung:
hilft das?

Code:
andreas@[local]:5434/test# select * from judad;
 id | f1 | f2
----+----+----
  1 |  1 |  1
  2 | 10 |  1
  3 | 10 |   
  4 | 10 | 10
  5 | 20 | 15
  6 | 20 | 20
(6 rows)

andreas@[local]:5434/test# select * from judad where case when f1 = 10 then case when f2 = 10 or f2 is null then true else false end when f1 = 20 then case when f2 = 20 then true else false end end;
 id | f1 | f2
----+----+----
  3 | 10 |   
  4 | 10 | 10
  6 | 20 | 20
(3 rows)

andreas@[local]:5434/test#
 
Erst einmal ein gutes neues Jahr.

Musste leider andere Projekte vorziehen.

Habe jetzt mal Deine Lösung angesehen - aber irgendwie kann ich das nicht für meine Zwecke auflösen. Ich möchte eigentlich wenn in Deinem Beispiel f1 = 10 ist dass nur Datensätze ausgegeben werden, bei denen f2 den Wert 10 oder null hat (Sprich Datensätze 3 & 4). Ist f1 ungleich 10 (f1 != 10) dann soll er nur Datensätze anzeigen wo f1 = f2 ist.
 
also würde da noch id=1 fehlen?

Code:
test=*# select * from judad where case when f1 = 10 then case when f2 = 10 or f2 is null then true else false end when f1 != 100 then case when f2 = f1 then true else false end end;
 id | f1 | f2
----+----+----
  1 |  1 |  1
  3 | 10 |   
  4 | 10 | 10
  6 | 20 | 20
(4 rows)
 
Hi & danke für die schnelle Reaktion!

Sorry, ich versuche es nochmals etwas genauer zu erläutern. Wenn f1 = 10 dann dürfen ausschließlich die die Datensätze 3 & 4 ausgegeben werden. Wenn f1 = 20 (oder jede ander Zahl ungleich 10) darf ausschließlich der Datensatz ausgegben werden bei denen f1=f2 ist und bei diesem Besipiel f2 = 20 ist (sprich ausschließlich der Datensatz 6). Ich gebe den f1 Wert dynamisch vor und möchte nur die Datrensätze bei denen der f2 Wert = dem f1 Wert aus der Vorgabe entspricht (außer f1 = 10 - dann müssen alle Datensätze ausgegben werden bei denen f1 = 10 und f2 = 10 oder null ist)

wenn f1 = 10 >> f2 = 10 oder null
wenn f1 = 20 >> f2 = 20
wenn f1 = 30 >> f2 = 30
wenn f1 = 40 >> f2 = 40
wenn f1 = 1 >> f2 = 1
wenn f1 = 90 >> f2 = 90
 
Hallo JudAD,

was spricht gegen die Zeile

Code:
AND beas_ftstl.aplanpos_id = ISNULL(beas_ftapl.pos_id , 10)

??

Viele Grüße,
Tommi
 
Hallo JudAD,

ein wenig Transformations-Leistung hilft hier: Ich habe anscheinend die Spalten vertauscht.
Mit dem ISNULL wird definiert, welchen Wert ich annehme, wenn in der Spalte ein NULL auftaucht.
Dass kann ich für die Abgleich-Spalte wiederholen.
Dann sieht die Zeile so aus:

Code:
AND ISNULL(beas_ftstl.aplanpos_id, 10) = ISNULL(beas_ftapl.pos_id , 10)

Wenn die Bedingung für die Spalte "beas_ftapl.pos_id" nicht gilt oder hier kein NULL zu erwarten ist, muss man das ISNULL natürlich wieder entfernen.

Gruß,
Tommi
 
Hi Tommi,

Danke nochmals für Deine Mühe.

Ich kenne zwar die Funktion ISNULL() aber das Feld beas_ftapl.pos_id wird nie NULL. Ich weiß auch nicht mehr wie ich es klarer definieren soll. Der Wert von beas_ftapl.pos_id wird als Parameter/Filter aus dem Programm übergeben. Sprich, bekomme ich vom Programm für das Feld beas_ftapl.pos_id den den Wert 10, dann sollen nur die Datensätze angezeigt werden die im Feld beas_ftstl.aplanpos_id den Wert NULL oder 10 haben. Bekomme ich für das Feld beas_ftapl.pos_id den den Wert 20 (oder jede x-beliebige Zahl ungleich 10), dann sollen nur die Datensätze angezeigt werden die im Feld beas_ftstl.aplanpos_id den Wert 20 haben (oder den x-beliebigen Wert der vom Programm für das Feld beas_ftapl.pos_id übergeben wird)
 
Hallo JudAD,

wenn Feld beas_ftapl.pos_id nicht NULL werden kann, muss der Fall auch nicht abgefangen werden, wie oben beschrieben.
Wie ich es verstanden habe, kann in der Spalte "beas_ftstl.aplanpos_id" aber ein NULL vorkommen, was dann dem Wert "10" entspricht.

Der Filter sieht dann, wie oben schon beschrieben, so aus:

Code:
AND ISNULL(beas_ftstl.aplanpos_id, 10) = beas_ftapl.pos_id

Bedeutet, dass der Wert NULL in der Spalte "beas_ftstl.aplanpos_id" mit dem Wert "10" ersetzt wird.
Der Vergleich ist für den Wert "10" in Spalte "beas_ftapl.pos_id" dann "true", wenn in der Spalte "beas_ftstl.aplanpos_id" der Wert "10" eingetragen ist. Der Wert "NULL" in der Spalte "beas_ftstl.aplanpos_id" wird ja ebenfalls durch den Wert "10" ersetzt und damit stimmt der Abgleich auch für diesen Fall.

Viele Grüße,
Tommi
 
Yeah ;-)

Werde es noch mit anderen Werten testen - aber das war es glaube ich.

Danke erst einmal. Werde gleich noch bereichten ob alle anderen Werte auch funktioneren.
 
Werbung:
Zurück
Oben