it-swarm.com.de

Können Sie einen Alias ​​in der WHERE-Klausel in MySQL verwenden?

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
116
user15063

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

217
Paul Dixon

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

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

4

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.

0
alpere
SELECT * FROM (SELECT customer_Id AS 'custId', gender, age FROM customer
    WHERE  gender = 'F') AS c
WHERE c.custId = 100;
0
anson