La consulta que estoy ejecutando es la siguiente, sin embargo, recibo este error:
# 1054 - Columna desconocida 'garantizado_código postal' en 'IN / ALL / ANY subquery'
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 `guaranteed_postcode` NOT IN #this is where the fake col is being used
(
SELECT `postcode` FROM `postcodes` WHERE `region` IN
(
'australia'
)
)
Mi pregunta es: ¿por qué no puedo usar una columna falsa en la cláusula where de la misma consulta DB?
mysql
sql
mysql-error-1054
James
fuente
fuente
HAVING
ejecuta más lento queWHERE
having
funciona porque los valores de las columnas deben calcularse antes de llegar alhaving
. Este no es el casowhere
, como se indicó anteriormente.Como señaló Víctor, el problema es con el alias. Sin embargo, esto se puede evitar colocando la expresión directamente en la cláusula WHERE x IN y:
Sin embargo, supongo que esto es muy ineficiente, ya que la subconsulta debe ejecutarse para cada fila de la consulta externa.
fuente
SQL estándar (o MySQL) no permite el uso de alias de columna en una cláusula WHERE porque
(de la documentación de MySQL ). Lo que puede hacer es calcular el valor de la columna en la cláusula WHERE , guardar el valor en una variable y usarlo en la lista de campos. Por ejemplo, podrías hacer esto:
Esto evita repetir la expresión cuando se complica, lo que hace que el código sea más fácil de mantener.
fuente
select @code:=sum(2), 2*@code
funciona en MySQL 5.5, pero para mí en 5.6 la segunda columna arroja NULL en la primera invocación, y devuelve 2 veces el resultado anterior cuando se ejecuta nuevamente. Lo suficientemente interesante, tanto seleccionar@code:=2, 2*@code
comoselect @code:=rand(), 2*@code
hacer funcionar en mi 5.6 (hoy). Pero esos de hecho están escribiendo y leyendo en la cláusula SELECT; en su caso lo está configurando en DONDE.Tal vez mi respuesta es demasiado tarde, pero esto puede ayudar a otros.
Puede encerrarlo con otra instrucción select y usar la cláusula where.
calcAlias es la columna de alias que se calculó.
fuente
Puede usar la cláusula HAVING para el filtro calculado en SELECCIONAR campos y alias
fuente
WHERE
yHAVING
. No son idénticos stackoverflow.com/search?q=where+vs+havingEstoy usando mysql 5.5.24 y el siguiente código funciona:
fuente
SQL estándar no permite referencias a alias de columna en una cláusula WHERE. Esta restricción se impone porque cuando se evalúa la cláusula WHERE, el valor de la columna puede no haberse determinado todavía. Por ejemplo, la siguiente consulta es ilegal:
SELECCIONE id, COUNT (*) COMO cnt FROM tbl_name DONDE cnt> 0 GROUP BY id;
fuente
Puede usar SUBSTRING (
locations
.raw
, -6,4) para donde la condiciónfuente