Использование псевдонима столбца в предложении WHERE запроса MySQL приводит к ошибке



запрос я таков, но я получаю эту ошибку:




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


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

525   8  

8 ответов:

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

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

скопировал из документация MySQL

Как указано в комментариях, использование HAVING вместо этого может выполнять работу. Обязательно дайте прочитать по адресу это , где был хотя.

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

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

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

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

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

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

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

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

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

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

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

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

Я использую 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'
 )
)

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

выберите id, COUNT (*) как cnt из tbl_name, где cnt > 0 GROUP by id;

вы можете использовать подстроку (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'
)
)

Comments

    Ничего не найдено.