[MySQL] Werte aus Subquery übernehmen bzw. doppeltes Select bei if()

joschilein

Multitalent
ID: 9301
L
5 Mai 2006
1.393
151
In einer recht komplizierten Abfrage kommt folgender Teil vor:
Code:
if((SELECT name FROM t1 WHERE id=1 LIMIT 1) = NULL, 0, name)

Das wird mir aber folgender Fehler ausgeworfen:
Code:
Unknown column 'name' in 'field list'

Die Spalte ist aber definitiv vorhanden. Also habe ich mir gedacht, dass wohl name nicht aus dem Subquery rauskommt, da in dem Fall zwar immer nur ein Wert ausgelesen wird (speziell wegen dem Limit), aber ein Wert ist für die Datenbank wohl was anderes als eine Ergebnis mit einer Spalte und einer Zeile - schließlich ist ja die Zahl 5 auch nicht gleich der Matrix M((5)).

Mit folgender Version klappt dann alles:
Code:
if((SELECT name FROM t1 WHERE id=1 LIMIT 1) = NULL, 0, (SELECT name FROM t1 WHERE id=1 LIMIT 1))

Nur wird ja dann der name ja dann unnötigerweise doppelt ausgelesen. Diese Zeile ist in der Abfrage mehrfach vorhanden (es werden dann jeweils andere Werte ausgelesen) und die ganze Abfrage befindet sich dann auf PHP Ebene in einer durchaus dutzendfachen Wiederholung, also könnte sich so ein Zeitverlust unnötigerweise merklich aufschaukeln..

Irgendwelche Lösungen, um den ausgelesenen Wert für "else" zwischenzuspeichern? Oder um innerhalb der if Abfrage als automatisches else den Wert des Vergleiches zu nehmen? Für letzteres Problem habe ich mir in Excel mal eine alternative wenn() Funktion gebastelt, weil ich da die doppelten Sachen nicht mehr haben wollte.
 
So einfach kann das Leben manchmal sein :roll:

Aber das trifft ja jetzt nur in dem speziellen Fall zu, wenn ich wirklich prüfe, ob das NULL ist. Gibts nicht auch ne allgemeine Funktion der Art

Code:
IF2(2 > 5; 100) // 2
IF2(9 > 5; 100) // 100
 
Aber IF(expr1, expr2, expr3) ist doch das was du willst, oder verstehe ich was falsch?

IF(expr1,expr2,expr3)

If expr1 is TRUE (expr1 <> 0 and expr1 <> NULL) then IF() returns expr2; otherwise it returns expr3. IF() returns a numeric or string value, depending on the context in which it is used.

mysql> SELECT IF(1>2,2,3);
-> 3
mysql> SELECT IF(1<2,'yes','no');
-> 'yes'
mysql> SELECT IF(STRCMP('test','test1'),'no','yes');
-> 'no'
 
Nein nicht ganz, denn es soll ein Teilparameter erneut verwendet werden

Code:
SELECT (IF ('test' = 'Weihnachten', 'Feiern', 'test') )

'test' nimmt hier als String mal den Platz einer ausführlichen Unterabfrage ein.
Jetzt hätte ich gerne sowas gemacht:
Code:
SELECT (IF ('test' as temp = 'Weihnachten', 'Feiern', temp) )
Endet aber natürlich in einem Fehler.

Mit folgendem Konstrukt stimmt die Syntax in expr1 wieder, aber dafür erkennt er jetzt bei expr3 wieder nicht, was mit der Variablen gemeint ist
Code:
SELECT (IF ((SELECT 'test' as temp) = 'Weihnachten', 'Feiern', temp) )
 
wie wäre es einfach mit nem left join? so eine konstruktion mit subqueries halt ich für zeimlich unnötig...