View Full Version : case in sql where statement
hallo Leute,
kann mir jemand die Syntax sagen, wenn ich in sql-select
ein "where" bzw. "and" Statement mit case bedingen möchte.
ich dachte:
select * from datei
where feld_a = 'xy'
and case when feld_b <> ' '
then feld_b = 'abc'
end
Also feld_b sollte nur gefiltert werden, wenn es
ungleich blank ist.
Vielen Dank
wie wäre es mit sowas wie:
select * from datei
where feld_a = 'xy'
and (feld_b=' ' or feld_b = 'abc')
Gruß
Christian
Also für diesen Fall ist case unsinnig:
select * from datei
where feld_a = 'xy'
and feld_b <> ' '
Case im Where sieht dann eher so aus (auch wenn es hier wieder unsinnig ist):
where case when feld <> ' ' then 'ABC' else 'XYZ' end = 'ABC'
Ich habe "CASE myfield is NULL then ... ENDCASE" und ähnliches oft benutzt, wenn Datensätze mit LEFT OUTER JOIN verknüpft wurden und nicht sicher war, daß die Felder im rechten Segment überhaupt gefüllt waren. Die Sätze mit NULL-en können nämlich nicht anders abgefragt werden. Das ist besonders bei Datumsfeldern problematisch ...
Außerdem habe ich in diesen Fällen oft Ersatzwerte für die NULL-Felder erzeugt. Da sehe ich überhaupt den Hauptzweck von CASE. Die CASE-Clause steht dann also an der Position eines selektierten Feldes. Sie muß natürlich immer einen Wert liefern, und ggf. mit OTHERWISE abgesichert werden.
@UFK
Hierfür bietet sich die einfache Funktion "value()" bzw. "coalesce()" an.
value(Field1, Field2, ...) <= AS/400-spezifisch
coalesce(Field1, Field2, ...) <= SQL-konform
Die Funktion liefert das 1. Feld, dass nicht NULL ist.
Gerade bei "left join" genau die Lösung an Stelle von "CASE ...".
Beispiel:
coalesce(MyField, 'Default')
Gut, "coalesce" ist für diesen Fall wohl passender.
Nochmal zurück zum CASE: ich habe, so glaube ich, CASE auch benutzt um Kennzeichen für komplizierte kombinierte aufgezählte Bedingungen zu bilden, Kennzeichen, die dann in jeden selektierten Datensatz aufgenommen werden. Bei Verwendung von WHERE kann ich Sätze zwar sehr gut selektieren, muß die nicht selektierten Sätze aber oft ein zweites und drittes Mal selektieren, um sie dann noch irgendwie berücksichtigen zu können. Und diese einzelnen Selektionen müßte ich dann mit UNION ALL wieder zusammenführen. Ok, das geht alles, aber ein CASE ist oft viel praktischer.
Case ist auch bei Group-By sehr schön zu verwenden, da im Group auch Ausdrücke erlaubt sind:
select firma, werk,
case
when kdnr between 1000 and 2000 then 'A'
when kdnr between 2001 and 5000 then 'B'
else 'C'
end as KDGRP
, sum(Umsatz)
from myfile
where ...
group by Firma, Werk,
case
when kdnr between 1000 and 2000 then 'A'
when kdnr between 2001 and 5000 then 'B'
else 'C'
end
liebe Leute,
die Anweisung läuft bereits wie geschmiert.