在MySQL查询的WHERE子句中使用列别名会产生错误

在MySQL查询的WHERE子句中使用列别名会产生错误

我正在运行的查询如下所示,但是我得到了这个错误:

#1054-‘IN/All/ANY子查询’中未知列‘已保证的_邮政编码’

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

我的问题是:为什么我不能在同一DB查询的WHERE子句中使用假列?


泛舟湖上清波郎朗
浏览 1285回答 3
3回答

MMMHUHU

只能在GROUPBY、ORDERBY或HAVING子句中使用列别名。标准SQL不允许在WHERE子句中引用列别名。施加此限制是因为在执行WHERE代码时,可能尚未确定列值。抄袭MySQL文档正如注释中所指出的,使用已代替可能完成工作。一定要看一下这个何去何从尽管如此。

慕娘9325324

正如维克多所指出的,问题在于化名。但是,可以避免这种情况,方法是将表达式直接放入WHERXINY子句中: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'  ))但是,我想这是非常低效率的,因为子查询必须对外部查询的每一行执行。
打开App,查看更多内容
随时随地看视频慕课网APP