it-swarm.com.de

Die Verwendung eines Spaltenalias in einer WHERE-Klausel funktioniert nicht

Gegeben eine Tabelle users mit zwei Feldern: id und email.

select id, email as electronic_mail 
from (  
        select id, email 
        from users
) t 
where electronic_mail = ''

Postgres beschwert sich darüber:

ERROR:  column "electronic_mail" does not exist

Das Beispiel soll nur das auftretende Problem demonstrieren. Mein tatsächlicher Fall ist komplexer. Ich iteriere durch ein Array von Elementen in einer JSON-Spalte und nehme jeweils einen einzelnen Skalarwert. (Ich kann Code freigeben, wenn das hilft.)

Ich verstehe wirklich nicht, was die Komplikation sein würde, wahrscheinlich weiß ich nichts. Ich hatte den Eindruck, dass Alias-Spalten problemlos in einer WHERE -Klausel verwendet werden können.

9
Victor

Das Handbuch verdeutlicht hier :

Der Name einer Ausgabespalte kann verwendet werden, um auf den Wert der Spalte in den Klauseln ORDER BY Und GROUP BY Zu verweisen, jedoch nicht in den Klauseln WHERE oder HAVING. dort müssen Sie stattdessen den Ausdruck ausschreiben.

Das entspricht dem SQL-Standard und ist möglicherweise nicht sehr intuitiv. Der (historische) Grund dafür ist die Abfolge von Ereignissen in einer SELECT Abfrage. WHERE und HAVING werden aufgelöst , bevor Spaltenaliasnamen berücksichtigt werden, während GROUP BY und ORDER BY Später , nachdem Spaltenaliasnamen angewendet wurden.
Beachten Sie auch, dass Konflikte zwischen Eingabe- und Ausgabenamen in ORDER BY Und GROUP BY Unterschiedlich gelöst werden - eine weitere historische Kuriosität (mit einem Grund dahinter, aber möglicherweise dennoch verwirrend). Sehen:

Vermeiden Sie am besten Spaltenaliasnamen, die a priori mit den Namen der Eingabespalten in Konflikt stehen.

Abgesehen davon: Die Unterabfrage in Ihrem Beispiel ist nur Rauschen, da die WHERE -Klausel Teil der äußeren Abfrage ist, sodass das Beispiel vereinfacht werden kann zu:

select id, email as electronic_mail 
from users t 
where electronic_mail = '';  -- doesn't work
13