Mimic: Bedingtes Select

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?

  1. Hi,

    Es soll, wenn bedingung = $special gefunden wird, dieser wert zurückgegeben werden, ansonsten der wert von $default

    Auch SQL kennt IF.

    MfG ChrisB

    --
    “Whoever best describes the problem is the person most likely to solve the problem.” [Dan Roam]
    1. 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.

      1. 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

        1. 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.

          1. 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
            ;

            1. Klasse, ja, das funktioniert!

              Vielen Dank!

  2. 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