272 votes

À l’aide d’alias de colonne à où la clause de requête MySQL génère une erreur

La requête que j’utilise est la suivante, cependant j’obtiens cette erreur :

#1054 - unknown column « guaranteed_postcode » dans « IN/ALL/ANY sous-requête »

Ma question est : pourquoi je ne peux pas utiliser une colonne fausse dans where clause de la même requête DB ?

536voto

victor hugo Points 16700

Vous ne pouvez utiliser les alias de colonne GROUP BY, ORDER BY ou clauses HAVING.

SQL standard ne permet pas de se référer à une colonne alias dans une clause WHERE. Cette restriction est imposée parce que lorsque le code où est exécuté, la valeur de la colonne ne peut pas encore être déterminée.

Copiés à partir de documentation MySql

24voto

rodion Points 2431

Comme l’a souligné Victor, le problème est avec l’alias. Cela peut être évité, en mettant l’expression directement dans l’endroit où x y clause :

Cependant, je suppose que c’est très inefficace, puisque la sous-requête doit être exécutée pour chaque ligne de la requête externe.

23voto

Joni Points 46728

Le Standard SQL (ou MySQL) ne permet pas l'utilisation d'alias de colonne dans une clause where, car

lorsque la clause where est évaluée, la valeur de la colonne n'ont pas encore été déterminée.

(à partir de la documentation de MySQL). Ce que vous pouvez faire est de calculer la valeur de la colonne dans le la clause, enregistrer la valeur dans une variable, et de l'utiliser dans la liste de champs. Par exemple, vous pourriez faire ceci:

SELECT `users`.`first_name`, `users`.`last_name`, `users`.`email`,
@postcode AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE (@postcode := SUBSTRING(`locations`.`raw`,-6,4)) NOT IN
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)

Cela évite l'évaluation de l'expression deux fois.

2voto

themis Points 2243

J’utilise mysql 5.5.24 et le code suivant fonctionne :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X