Использование псевдонима столбца в предложении WHERE запроса MySQL приводит к ошибке - PullRequest
169 голосов
/ 03 июня 2009

Запрос, который я выполняю, выглядит следующим образом, однако я получаю эту ошибку:

# 1054 - Неизвестный столбец «Guaranteed_postcode» в «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'
 )
)

У меня вопрос: почему я не могу использовать поддельный столбец в предложении where того же запроса к БД?

Ответы [ 8 ]

389 голосов
/ 03 июня 2009

Вы можете использовать псевдонимы столбцов только в предложениях GROUP BY, ORDER BY или HAVING.

Стандартный SQL не позволяет вам обратитесь к псевдониму столбца в ГДЕ пункт. Это ограничение наложено потому что, когда код WHERE выполнено, значение столбца может еще не быть определенным.

Скопировано из Документация MySQL

Как указано в комментариях, вместо этого можно использовать HAVING. Обязательно прочитайте на этом ГДЕ против ГЛАВНОГО хотя.

23 голосов
/ 03 июня 2009

Как отметил Виктор, проблема в псевдониме. Этого можно избежать, поместив выражение непосредственно в предложение 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'
 )
)

Однако, я думаю, это очень неэффективно, поскольку подзапрос должен выполняться для каждой строки внешнего запроса.

18 голосов
/ 27 июля 2012

Стандартный SQL (или MySQL) не разрешает использование псевдонимов столбцов в предложении WHERE, поскольку

при оценке предложения WHERE значение столбца может быть еще не определено.

(из документации MySQL ). Что вы можете сделать, так это вычислить значение столбца в предложении WHERE , сохранить значение в переменной и использовать его в списке полей. Например, вы можете сделать это:

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

Это позволяет избежать повторения выражения, когда оно усложняется, что облегчает поддержку кода.

13 голосов
/ 29 августа 2014

Может быть, мой ответ слишком поздно, но это может помочь другим.

Вы можете заключить его в другой оператор выбора и использовать для него предложение where.

SELECT * FROM (Select col1, col2,...) as t WHERE t.calcAlias > 0

calcAlias ​​- это столбец псевдонимов, который был рассчитан.

8 голосов
/ 14 апреля 2015

Вы можете использовать предложение HAVING для фильтра, рассчитанного в полях SELECT и псевдонимах

1 голос
/ 07 сентября 2012

Я использую mysql 5.5.24 и работает следующий код:

select * from (
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`
) as a
WHERE guaranteed_postcode NOT IN --this is where the fake col is being used
(
 SELECT `postcode` FROM `postcodes` WHERE `region` IN
 (
  'australia'
 )
)
0 голосов
/ 21 марта 2018

Вы можете использовать SUBSTRING (locations. raw, - 6,4) для условий, где

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'
)
)
0 голосов
/ 27 сентября 2016

Стандартный SQL запрещает ссылки на псевдонимы столбцов в предложении WHERE. Это ограничение наложено потому, что при оценке предложения WHERE значение столбца может еще не быть определено. Например, следующий запрос недопустим:

SELECT id, COUNT (*) AS cnt ОТ tbl_name WHERE cnt> 0 GROUP BY id;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...