MySQL - IF, Case!? Wie?

secret_3des

Lieutenant
Registriert
Sep. 2005
Beiträge
822
Hallo!

Ich möchte folgendes per SQL-Abfrage realisieren:
Es soll nach Werten gesucht werden, die in einem bestimmten Intervall liegen [up,low]. Werden aber keine Werte in diesem Intervall gefunden, sollen die Werte gefunden werden, die möglichst nahe an den Grenzen des Intervalls liegen.

Mir ist im Prinzip klar, wie es funktionieren könnte. Ich habe aber leider noch keine Möglichkeit gefunden, das auch so umzusetzen. Es wäre deshalb toll, wenn mir da jemand helfen könnte.

Bisheriger Ansatz ist:
Code:
SELECT MIN(ABS(attribut - (up+low)/2)) AS result FROM tabelle;

// wenn es einen Wert im Intervall gibt
IF (result < (up-low)/2) THEN 
SELECT * FROM tabelle WHERE attribut > low AND attribut < up;

// es gibt keinen Wert im Intervall
ELSE
SELECT * FROM tabelle WHERE result = ABS(attribut-(up+low)/2);

oder auch:

Code:
SELECT CASE 
(SELECT COUNT(*) FROM tabelle WHERE attribut > low AND attribut < 50000)
WHEN 0 THEN
SELECT * FROM tabelle WHERE attribut > low AND attribut < up;
ELSE
SELECT * FROM tabelle WHERE ABS(attribut - (low+up)/2) = 
(SELECT MIN(ABS(attribut - (up+low)/2)) AS result FROM tabelle);

Das Problem ist aber, dass es nicht funktioniert.. Im THEN bzw. ELSE Fall sind keine Abfragen (sondern nur einzelne Werte) erlaubt.
Wer hat eine Idee wie das funktionieren könnte?

Vielen Dank im Voraus!

Gruß
Tom
 
Hallo secret_3des,

das sollte sein was du suchst, wenn nicht lass es mich wissen
Code:
--Normalfall: alle Werte zwischen <low> und <up> 
SELECT  * 
FROM    <<tabelle>>
WHERE   <<attribut>> > low 
AND     <<attribut>> < up

UNION ALL

--Fallback: gibt es keine Werte zwischen <low> und <up> so wird diese Menge geliefert
SELECT  * 
FROM    <<tabelle>>
WHERE   NOT EXISTS (
			SELECT  *
			FROM    <<tabelle>>
			WHERE   <<attribut>> > low 
			AND     <<attribut>> < up
		)
		
AND     ABS(attribut - (low+up)/2) = (			
			SELECT  MIN( ABS( attribut - (up+low) / 2 ) ) 
			FROM    <<tabelle>>
		)
 
Vielen Dank für deine Hilfe! Ich hatte nicht mehr damit gerechnet, dass ich eine Antwort bekomme, umso mehr freue ich mich, dass du dir die Zeit genommen hast und mir diese schöne Lösung präsentiert hast. :-)
 
Zurück
Oben