140 votes

Colonne inconnue dans la clause Where

J'ai une question simple :

SELECT u_name AS user_name FROM users WHERE user_name = "john";

Je reçois Unknown Column 'user_name' in where clause . Je ne peux pas faire référence à 'user_name' dans d'autres parties de la déclaration, même après select 'u_name as user_name' ?

107voto

dacracot Points 8567

Le SQL est évalué à l'envers, de droite à gauche. Ainsi, la clause where est analysée et évaluée avant la clause select. C'est pourquoi l'alias de u_name vers user_name n'a pas encore eu lieu.

57voto

Septimus Points 69

Qu'en est-il :

SELECT u_name AS user_name FROM users HAVING user_name = "john";

39voto

Paul Dixon Points 122033

Voir la page de manuel MySQL suivante : http://dev.mysql.com/doc/refman/5.0/en/select.html

"On peut donner un alias à un select_expr. en utilisant AS nom_alias. L'alias est utilisé comme nom de colonne de l'expression et et peut être utilisé dans les clauses GROUP BY, ORDER BY, ou HAVING".

(...)

Il n'est pas permis de faire référence à un alias de colonne dans une clause WHERE, car la valeur de la colonne peut ne pas être déterminée au moment où la clause WHERE est exécutée. Voir la Section B.5.4.4, "Problèmes liés aux alias de colonne". alias de colonne".

13voto

Mark S. Points 789
select u_name as user_name from users where u_name = "john";

Pensez-y de la manière suivante : votre clause where est évaluée en premier, afin de déterminer quelles lignes (ou lignes jointes) doivent être renvoyées. Une fois la clause where exécutée, la clause select s'exécute pour elle.

Pour mieux le dire, imaginez ceci :

select distinct(u_name) as user_name from users where u_name = "john";

Vous ne pouvez pas faire référence à la première moitié sans la seconde. La clause Where est toujours évaluée en premier, puis la clause Select.

11voto

Vincent Vega Points 11

Si vous essayez d'exécuter une requête comme la suivante (trouver tous les nœuds ayant au moins une pièce jointe) où vous avez utilisé une instruction SELECT pour créer un nouveau champ qui n'existe pas réellement dans la base de données, et que vous essayez d'utiliser l'alias pour ce résultat, vous rencontrerez le même problème :

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
WHERE attachments.nodeid = nodes.id) AS attachmentcount 
FROM nodes
WHERE attachmentcount > 0;

Vous obtiendrez une erreur "Unknown column 'attachmentcount' in WHERE clause".

La solution est en fait assez simple - il suffit de remplacer l'alias par la déclaration qui produit l'alias, par exemple :

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
WHERE attachments.nodeid = nodes.id) AS attachmentcount 
FROM nodes 
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;

Vous obtiendrez toujours l'alias retourné, mais maintenant SQL ne devrait pas se planter sur l'alias inconnu.

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