Неизвестный столбец в пункте «Где» - PullRequest
104 голосов
/ 30 сентября 2008

У меня простой запрос:

SELECT u_name AS user_name FROM users WHERE user_name = "john";

Я получаю Unknown Column 'user_name' in where clause. Могу ли я не ссылаться на 'user_name' в других частях заявления даже после select 'u_name as user_name'?

Ответы [ 18 ]

78 голосов
/ 30 сентября 2008

SQL оценивается в обратном порядке, справа налево. Таким образом, предложение where анализируется и оценивается до предложения select. Из-за этого псевдоним u_name к user_name еще не произошел.

32 голосов
/ 30 сентября 2008

См. Следующую страницу руководства MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html

"select_expr может быть присвоен псевдоним используя AS alias_name. Псевдоним используется в качестве имени столбца выражения и может использоваться в GROUP BY, ORDER BY или HAVING пункты. "

(...)

Недопустимо ссылаться на псевдоним столбца в предложении WHERE, потому что значение столбца еще не может быть определено, когда ГДЕ пункт выполнен. См. Раздел B.5.4.4, «Проблемы со столбцом». Псевдонимы».

31 голосов
/ 04 октября 2010

А как же:

SELECT u_name AS user_name FROM users HAVING user_name = "john";
12 голосов
/ 30 сентября 2008
select u_name as user_name from users where u_name = "john";

Подумайте об этом так, ваше предложение where оценивается первым, чтобы определить, какие строки (или соединенные строки) необходимо вернуть. После выполнения предложения where для него выполняется предложение select.

Проще говоря, представьте себе:

select distinct(u_name) as user_name from users where u_name = "john";

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

10 голосов
/ 26 мая 2011

Если вы пытаетесь выполнить запрос, подобный следующему (найдите все узлы с хотя бы одним вложением), где вы использовали инструкцию SELECT, чтобы создать новое поле, которое фактически не существует в базе данных, и попробуйте использовать псевдоним для того результата, с которым вы столкнетесь с той же проблемой:

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
WHERE attachments.nodeid = nodes.id) AS attachmentcount 
FROM nodes
WHERE attachmentcount > 0;

Вы получите ошибку "Неизвестный столбец 'attachmentcount' в предложении WHERE".

Решение на самом деле довольно простое - просто замените псевдоним оператором, который создает псевдоним, например:

SELECT nodes.*, (SELECT (COUNT(*) FROM attachments 
WHERE attachments.nodeid = nodes.id) AS attachmentcount 
FROM nodes 
WHERE (SELECT (COUNT(*) FROM attachments WHERE attachments.nodeid = nodes.id) > 0;

Вы все равно получите возвращенный псевдоним, но теперь SQL не должен скрывать неизвестный псевдоним.

6 голосов
/ 30 июля 2013

Ваше определенное alias не приветствуется предложением WHERE, для которого вы должны использовать предложение HAVING

SELECT u_name AS user_name FROM users HAVING user_name = "john";

ИЛИ вы можете напрямую использовать исходное имя столбца с WHERE

SELECT u_name AS user_name FROM users WHERE u_name = "john";

То же, что и результат, определенный пользователем в качестве псевдонима в результате подзапроса или любого вычисления; к нему будет обращаться предложение HAVING, а не WHERE

SELECT u_name AS user_name ,
(SELECT last_name FROM users2 WHERE id=users.id) as user_last_name
FROM users  WHERE u_name = "john" HAVING user_last_name ='smith'
6 голосов
/ 30 сентября 2008

Или:

SELECT u_name AS user_name
FROM   users
WHERE  u_name = "john";

или

SELECT user_name
from
(
SELECT u_name AS user_name
FROM   users
)
WHERE  u_name = "john";

Последний должен быть таким же, как и первый, если СУБД поддерживает предикат, выдвигаемый во встроенное представление.

5 голосов
/ 30 сентября 2008

Нет, вам нужно выбрать его с правильным именем. Если вы дали таблицу, которую вы выбрали из псевдонима, вы можете использовать ее.

5 голосов
/ 30 сентября 2008

исправлено:

SELECT u_name AS user_name FROM users WHERE u_name = 'john';
3 голосов
/ 30 сентября 2008

Нет, вы не можете. имя_пользователя не существует до времени возврата.

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