[SQL] Ausdruck-Alias in WHERE-Anweisung

tedlemegba

abgemeldet
20 April 2006
2.729
175
SELECT *, (a = b) AS c FROM `benutzer` WHERE c

Ahoi! Habe eben ein lustiges Problem!
Ich gebe im Moment dem booleschen Wert [a = b ist entweder true, false] einen Alias [c]. Wieso kann ich mit dem Wert nicht in der WHERE-Klausel arbeiten? [#1054 - Unknown column 'c' in 'where clause']

Oberes Beispiel eventuell zur kurios. Ich weite es (hoffentlich) in ein verständlicheres Beispiel aus:
SELECT *, (a = b) as c, (d = e) AS f FROM `benutzer` WHERE c OR d

Von mir aus auch WHERE c = 1 OR f = 1. (Keine Ahnung, ob (my)SQL so mit booleschen Werten wie oben umgehen kann, denke aber schon!)

Zu beachten: das OR!

Ansonsten muss ich den ganzen Ausdrücke für den booleschen Wert [a = b, etc.] nochmal extra später in der WHERE-Klausel voll ausschreiben und bei meinen Ausdrücken wird das sehr schnell unübersichtlich.

Nicht möglich - oder falsch verwendet? Danke! :D
 
strolch00 schrieb:

Aliasfelder können nicht in der WHERE-Klausel verwendet werden.
Du musst denselben Wert in der WHERE-Klausel erneut berechnen.
Der Grund hierfür liegt in der Vereinfachung der internen Optimierung. Es sollen einfach keine Felder berechnet werden, die eventuell nicht benötigt werden. Daher werden Aliasfelder grundsätzlich erst zum Schluss berechnet, wenn sicher ist, dass die Zeile auch in die Ergebnistabelle übernommen wird.

Dankeschön. Wie doof.

Eben noch was bemerkt:
Wenn ich zum Beispiel die Summe von Aliasen Bilden will [sprich beispielsweise: a + b+ c], klappt das leider nicht. Irgendwie ist die Verwendung von Aliasen da dann (imho) [leider] recht billig verwirklicht. :ugly:
 
Naja wenn Aliases nur am ende der Anfrage berechnet werden kann man in der Anfrage selber nix mit denen anfangen diese sind also wirklich nur bei der Ausgabe nützlich wenn was berechnet wurde.

Ps hatte ich mich auch immer schon gefragt ob aliases in der WHERE gingen und endlich habe ich mal gegoogled :LOL:
 
happymaster schrieb:
:ugly: :mrgreen:

Hm. Na ja. Danke auf jeden Fall! Wie doof SQL doch sein kann. :(
ich sage dazu net doof sondern resourcen schonend ;) und nen tip speicher dir deinen Bedingungen in eine Variable und setzte die Variable anstatt dem Alias in die Querie ein

happymaster schrieb:
Ansonsten muss ich den ganzen Ausdrücke für den booleschen Wert [a = b, etc.] nochmal extra später in der WHERE-Klausel voll ausschreiben und bei meinen Ausdrücken wird das sehr schnell unübersichtlich.
 
strolch00 schrieb:
und nen tip speicher dir deinen Bedingungen in eine Variable und setzte die Variable anstatt dem Alias in die Querie ein
Wie meinste das? Na ja also die Bedingung ist keine "normale"/"konstante"/"statische" (*es mal so nennen mag*), sondern eine "dynamische" (*auch das mal so nennen mag*): sie setzt sich aus Feldern des aktuellen Datensatzes zusammen.

Einfaches Beispiel:
loginname = vorname
 
ich meine es folgender maßen

PHP:
$bool_c = "(a = b)";
$boold_d = "(d = e)";
$sql = "SELECT *, ".$bool_c.", ".$bool_d." FROM `benutzer` WHERE ".$bool_c." OR ".$bool_d;

//anstatt diesem Querie

SELECT *, (a = b) as c, (d = e) AS f FROM `benutzer` WHERE c OR d
 
strolch00 schrieb:
ich meine es folgender maßen
Joa und damit hast du es nicht wirklich verstanden. Ich brauche einzelne Felder aus dem Datensatz um die booleschen Werte pro Datensatz zu errechnen. So müsste ich die Werte erst auslesen und dann nochmal für jeden Datensatz also zwei Queries.. außerdem krieg ich das dann wohl nur in einer Schleife hin, die dann immer noch eine Query ausführt - eher ungut. Wobei ich ja auch keine Wort über eine Skriptsprache verloren hab'! :p
 
happymaster schrieb:
Joa und damit hast du es nicht wirklich verstanden. Ich brauche einzelne Felder aus dem Datensatz um die booleschen Werte pro Datensatz zu errechnen. So müsste ich die Werte erst auslesen und dann nochmal für jeden Datensatz also zwei Queries.. außerdem krieg ich das dann wohl nur in einer Schleife hin, die dann immer noch eine Query ausführt - eher ungut. Wobei ich ja auch keine Wort über eine Skriptsprache verloren hab'! :p
:sing: ich habe nix gesagt ^^
aber jap damit hast du recht hmm :think: vielleicht nen Subquerie aber das weist du am besten