У меня простой запрос:
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'?






Нет, ты не можешь. user_name не существует до времени возврата.
Нет, вам нужно выбрать его с правильным именем. Если вы указали таблицу, которую выбираете из псевдонима, вы можете использовать это.
исправлено:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
SQL оценивается в обратном порядке, справа налево. Таким образом, предложение where анализируется и оценивается до предложения select. Из-за этого псевдоним u_name на user_name еще не произошел.
Имеет смысл сказать, что весь оператор анализируется, преобразуется и оптимизируется в целом в рамках сложного многоступенчатого процесса. "SQL оценивается в обратном порядке, справа налево" неправильно.
неполный ответ, поскольку пользователь спросил, можно ли использовать "user_name" в заявлении, которое может быть после, например "ИМЕЕТ"
Либо:
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";
Последнее должно быть таким же, как и первое, если СУБД поддерживает отправку предикатов во встроенное представление.
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.
Хотя вы можете использовать псевдонимы для своих таблиц в запросе (например, «SELECT u.username FROM users u;»), вы должны использовать фактические имена столбцов, на которые вы ссылаетесь. AS влияет только на то, как возвращаются поля.
Я думаю, вы можете использовать псевдоним в некоторых СУБД, например MySql. Однако вы правы для Sql Server.
См. Следующую страницу руководства MySQL: http://dev.mysql.com/doc/refman/5.0/en/select.html
"A select_expr can be given an alias using AS alias_name. The alias is used as the expression's column name and can be used in GROUP BY, ORDER BY, or HAVING clauses."
(...)
It is not permissible to refer to a column alias in a WHERE clause, because the column value might not yet be determined when the WHERE clause is executed. See Section B.5.4.4, “Problems with Column Aliases”.
Также обратите внимание (от человека по MySQL): стандарт SQL требует, чтобы HAVING ссылался только на столбцы в предложении GROUP BY или столбцы, используемые в агрегатных функциях. Однако MySQL поддерживает расширение этого поведения и позволяет HAVING ссылаться на столбцы в списке SELECT, а также на столбцы во внешних подзапросах.
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
Зачем вам нужен подзапрос? Гораздо проще без.
Неизвестный столбец в предложении WHERE, вызванный строками 1 и 2 и разрешенный строкой 3:
$sql = "SELECT * FROM users WHERE username = ".$userName;$sql = "SELECT * FROM users WHERE username = ".$userName."";$sql = "SELECT * FROM users WHERE username ='".$userName."'";Что вы изменили и почему? Кроме того, почему вы разместили код, который широко открыт для SQL-инъекций?
Что о:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
Зачем в этом случае использовать HAVING вместо WHERE?
@PeteGO относится к ответу Пола Диксона. tldr; HAVING оценивается позже, чем WHERE и, что более важно, SELECT.
Если вы пытаетесь выполнить следующий запрос (найти все узлы с хотя бы одним вложением), в котором вы использовали оператор 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 не должен работать с неизвестным псевдонимом.
Я столкнулся с этой проблемой и наткнулся на ваш ответ - спасибо! Следует отметить, что это (понятно) немного медленнее для больших баз данных, но я все равно имею дело с глупой настройкой унаследованной базы данных.
Я считаю, что у вас есть дополнительный ( в вашем запросе перед (COUNT(*), который нигде не закрывается.
Но разве оператор SELECT не запускается дважды?
Я далеко не эксперт по mysql, но это кажется очень неэффективным. Я испытал, что вложенные выборки значительно замедляют выполнение запроса.
Может быть поможет.
Ты можешь
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
Оно работает.
НО УБЕДИТЕСЬ, ЧТО ВЫ ДЕЛАЕТЕ!
Но, может быть, в некоторых случаях это помогает
У меня была такая же проблема, я нашел это полезным.
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
не забудьте заключить $ user в одинарные кавычки.
Этот код широко открыт для SQL-инъекций. Никто не должен использовать этот код для решения данной проблемы.
Ваш определенный 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'
Просто была эта проблема.
Убедитесь, что в имени объекта в базе данных нет места.
например user_name вместо user_name
попробуйте свою задачу, используя условие В или условие ИЛИ ЖЕ, а также этот запрос работает на spark-1.6.x
SELECT patient, patient_id FROM `patient` WHERE patient IN ('User4', 'User3');
или же
SELECT patient, patient_id FROM `patient` WHERE patient = 'User1' OR patient = 'User2';
Для меня корнем проблемы был номер, который я скопировал для использования в предложении WHERE. Номер имел «невидимый» символ, по крайней мере, для MySQL Workbench. Я поместил номер в консоль Chrome, он был хорошо виден.
Я думаю, что лучше сказать "наизнанку", чем "назад".