Ich muss einen Alias in der WHERE-Klausel verwenden, aber es sagt mir immer wieder, dass es sich um eine unbekannte Spalte handelt. Gibt es eine Möglichkeit, dieses Problem zu umgehen? Ich muss Datensätze auswählen, deren Bewertung höher als x ist. Die Bewertung wird als folgender Alias berechnet:
sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
Sie können eine HAVING-Klausel verwenden, mit der die Aliase angezeigt werden , z.
HAVING avg_rating>5
in einer where-Klausel müssen Sie jedoch Ihren Ausdruck wiederholen, z.
WHERE (sum(reviews.rev_rating)/count(reviews.rev_id))>5
ABER! Nicht alle Ausdrücke sind zulässig. Die Verwendung einer Aggregationsfunktion wie SUMME funktioniert nicht. In diesem Fall müssen Sie eine HAVING-Klausel verwenden.
Aus dem MySQL Manual :
Es ist nicht zulässig, in einer WHERE-Klausel auf einen Spaltenalias zu verweisen, da der Spaltenwert möglicherweise noch nicht bestimmt wurde, als die WHERE-Klausel ausgeführt wurde. Siehe Abschnitt B.1.5.4, „Probleme mit Spaltenaliasen“ .
Keine Ahnung, ob dies in MySQL funktioniert, aber mit SQL Server können Sie es auch einfach so umbrechen:
select * from (
-- your original query
select .. sum(reviews.rev_rating)/count(reviews.rev_id) as avg_rating
from ...) Foo
where Foo.avg_rating ...
Diese Frage ist ziemlich alt und eine Antwort hat bereits 160 Stimmen erhalten ...
Trotzdem möchte ich folgendes klarstellen: Die Frage ist eigentlich nicht , ob Aliasnamen in der WHERE
-Klausel verwendet werden können.
sum(reviews.rev_rating) / count(reviews.rev_id) as avg_rating
ist eine Aggregation. In der WHERE
-Klausel schränken wir die Datensätze ein, die wir aus den Tabellen erhalten möchten, indem wir ihre Werte betrachten. sum(reviews.rev_rating)
und count(reviews.rev_id)
sind jedoch keine Werte, die wir in einem Datensatz finden. Dies sind Werte, die wir erst nach Aggregation der Datensätze erhalten.
Also ist WHERE
unangemessen. Wir brauchen HAVING
, da wir die Ergebniszeilen nach der Aggregation einschränken wollen. Das kann nicht sein
WHERE avg_rating > 10
noch
WHERE sum(reviews.rev_rating) / count(reviews.rev_id) > 10
daher.
HAVING sum(reviews.rev_rating) / count(reviews.rev_id) > 10
zum anderen ist dies möglich und entspricht dem SQL-Standard. Wohingegen
HAVING avg_rating > 10
ist nur in MySQL möglich. Es ist laut Standard kein gültiges SQL, da die SELECT
-Klausel nach HAVING
ausgeführt werden soll. Aus den MySQL-Dokumenten:
Eine andere MySQL-Erweiterung zu Standard-SQL ermöglicht Verweise in der HAVING-Klausel auf Alias-Ausdrücke in der Auswahlliste.
Die MySQL-Erweiterung ermöglicht die Verwendung eines Alias in der HAVING-Klausel für die aggregierte Spalte
https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
Wenn Ihre Abfrage statisch ist, können Sie sie als Ansicht definieren und diesen Alias in der where-Klausel verwenden, während Sie die Ansicht abfragen.
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
WHERE gender = 'F') AS c
WHERE c.custId = 100;