Bedingtes Select
Mimic
- datenbank
Hi zusammen,
ich bin auf der Suche nach einer eleganten Lösung für folgende bedingte Abfrage:
-----
Tabelle
id bedingung wert
1 3 foo1
2 8 foo2
3 12 foo3
4 6 foo4
5 6 foo5
6 11 foo6
Gegeben sind zwei mögliche Werte für bedingung: $special oder $default
Es soll, wenn bedingung = $special gefunden wird, dieser wert zurückgegeben werden, ansonsten der wert von $default
Also z.B.
$special = 8
$default = 3
soll foo2 liefern
aber
$special = 17
$default = 3
soll foo1 liefern
-----
Bisher selecte ich einfach mit OR und die Entscheidung ob $special oder $default benutzt wird, macht die PHP Logik danach. So muss ich aber zwei Zeilen einlesen und es wäre doch verdammt chic, wenn die query schon die richtige Zeile liefern würde :-)
Jemand eine Idee/ einen Ansatz?
Hi,
Es soll, wenn bedingung = $special gefunden wird, dieser wert zurückgegeben werden, ansonsten der wert von $default
Auch SQL kennt IF.
MfG ChrisB
Auch SQL kennt IF.
SQL schon, aber ich nicht :-)
Vielen Dank schon mal, aber so ganz bekomme ich es nicht hin:
SELECT IF ((SELECT 1 FROM tabelle WHERE bedingung = 8),
(SELECT wert FROM tabelle WHERE bedingung = 8),
(SELECT wert FROM tabelle WHERE bedingung = 3)
)
AS wert
FROM tabelle
liefert mir das Ergebnis mehrmals, d.h. so oft, wie die Tabelle Einträge hat.
Und sonderlich schön sieht die query auch noch nicht aus.
Mach ich da einen Denkfehler? Geht das einfacher?
Danke.
moin,
Mach ich da einen Denkfehler? Geht das einfacher?
CASE ist in aller regel eine gute verwendung zur fallunterscheidung, weil es sehr viele dbms unterstützen.
SELECT CASE
WHEN bedingung = $special
THEN $special
ELSE $default
END
FROM tabelle
;
Ilja
CASE ist in aller regel eine gute verwendung zur fallunterscheidung, weil es sehr viele dbms unterstützen.
Hi Ilja,
vielen Dank, aber ich fürchte das löst mein Problem nicht. Denn es geht ja nicht um eine Fallunterscheidung dieser Art.
Was ich suche ist ja ein query, das mir die special-zeile ausgibt, wenn sie existiert, ansonsten die default-zeile.
moin,
Was ich suche ist ja ein query, das mir die special-zeile ausgibt, wenn sie existiert, ansonsten die default-zeile.
ist in etwa das gleiche, nru eben in der WHERE klausel:
SELECT t1.*
FROM tabelle t1
WHERE t1.bedingung = CASE
WHEN EXISTS (SELECT NULL
FROM tabelle t2
WHERE bedingung = $special
)
THEN $special
ELSE $default
END
;
Klasse, ja, das funktioniert!
Vielen Dank!
Tag,
Jemand eine Idee/ einen Ansatz?
Welches DBMS benutzt Du?
Oracle kennt z.b. DECODE, was glaube ich genau das macht was Du suchst.
Vielleicht gibts in MySQL was ähnliches?
Viele Grüße,
Jörg