PDA

View Full Version : case in sql where statement



rr2001
20-07-07, 10:36
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

cbe
20-07-07, 13:18
wie wäre es mit sowas wie:

select * from datei
where feld_a = 'xy'
and (feld_b=' ' or feld_b = 'abc')

Gruß
Christian

Fuerchau
20-07-07, 13:58
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'

UFK
21-07-07, 00:56
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.

Fuerchau
22-07-07, 11:07
@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')

UFK
22-07-07, 16:32
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.

Fuerchau
23-07-07, 09:58
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

rr2001
23-07-07, 10:19
liebe Leute,

die Anweisung läuft bereits wie geschmiert.