Saltar al contenido

El uso de alias de columna en la cláusula WHERE de la consulta MySQL produce un error

Si te encuentras con algo que no entiendes puedes comentarlo y haremos todo lo necesario de ayudarte lo mas rápido que podamos.

Solución:

Solo puede usar alias de columna en las cláusulas GROUP BY, ORDER BY o HAVING.

SQL estándar no le permite hacer referencia a un alias de columna en una cláusula WHERE. Esta restricción se impone porque cuando se ejecuta el código WHERE, es posible que aún no se determine el valor de la columna.

Copiado de la documentación de MySQL

Como se señaló en los comentarios, usar HAVING en su lugar puede hacer el trabajo. Asegúrese de leer también esta pregunta: DÓNDE vs TENER.

Como señaló Víctor, el problema está en el alias. Sin embargo, esto se puede evitar colocando la expresión directamente en la cláusula WHERE x IN y:

SELECT `users`.`first_name`,`users`.`last_name`,`users`.`email`,SUBSTRING(`locations`.`raw`,-6,4) AS `guaranteed_postcode`
FROM `users` LEFT OUTER JOIN `locations`
ON `users`.`id` = `locations`.`user_id`
WHERE SUBSTRING(`locations`.`raw`,-6,4) NOT IN #this is where the fake col is being used
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)

Sin embargo, supongo que esto es muy ineficiente, ya que la subconsulta debe ejecutarse para cada fila de la consulta externa.

SQL estándar (o MySQL) no permite el uso de alias de columna en una cláusula WHERE porque

cuando se evalúa la cláusula WHERE, es posible que aún no se haya determinado el valor de la columna.

(de la documentación de MySQL). Lo que puede hacer es calcular el valor de la columna en el DÓNDE cláusula, guarde el valor en una variable y utilícelo en la lista de campos. Por ejemplo, podrías hacer esto:

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'
 )
)

Esto evita repetir la expresión cuando se complica, lo que facilita el mantenimiento del código.

Te mostramos las reseñas y valoraciones de los lectores

Nos encantaría que puedieras compartir este post si te fue útil.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *