我有一个简单的查询:
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'
吗?
答案 0 :(得分:78)
从右到左向后计算SQL。因此,在select子句之前解析和评估where子句。因此,尚未发生u_name到user_name的别名。
答案 1 :(得分:32)
请参阅以下MySQL手册页:http://dev.mysql.com/doc/refman/5.0/en/select.html
“select_expr可以被赋予别名 使用AS alias_name。使用别名 作为表达式的列名和 可以在GROUP BY,ORDER BY或。中使用 有条款。“
(...)
不允许在WHERE子句中引用列别名, 因为WHERE时可能尚未确定列值 子句被执行。请参见第B.5.4.4节“列的问题 别名”。
答案 2 :(得分:31)
怎么样:
SELECT u_name AS user_name FROM users HAVING user_name = "john";
答案 3 :(得分:12)
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子句。
答案 4 :(得分:10)
如果您尝试执行以下查询(查找具有至少一个附件的所有节点),您使用SELECT语句创建一个实际上不存在于数据库中的新字段,并且尝试使用该结果的别名,你将遇到同样的问题:
SELECT nodes.*, (SELECT (COUNT(*) FROM attachments
WHERE attachments.nodeid = nodes.id) AS attachmentcount
FROM nodes
WHERE attachmentcount > 0;
在WHERE子句中,您将收到错误“未知列'attachmentcount'。
解决方案实际上非常简单 - 只需用产生别名的语句替换别名,例如:
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不应该使用未知别名。
答案 5 :(得分:6)
或者:
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";
如果RDBMS支持谓词推入内联视图,后者应该与前者相同。
答案 6 :(得分:6)
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'
答案 7 :(得分:5)
不需要使用正确的名称选择它。如果你给了表,你可以从别名中选择,但是你可以使用它。
答案 8 :(得分:5)
校正:
SELECT u_name AS user_name FROM users WHERE u_name = 'john';
答案 9 :(得分:3)
不,你不能。 user_name在返回时间之前不存在。
答案 10 :(得分:2)
第1行和第2行引起的WHERE
子句中的未知列,并由第3行解析:
$sql = "SELECT * FROM users WHERE username =".$userName;
$sql = "SELECT * FROM users WHERE username =".$userName."";
$sql = "SELECT * FROM users WHERE username ='".$userName."'";
答案 11 :(得分:1)
刚出现这个问题。
确保数据库中实体名称中没有空格。
e.g。 ' USER_NAME'而不是' user_name'
答案 12 :(得分:1)
可能有帮助。
你可以
SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";
有效。
但请确认你做了什么!
但是,在某些情况下可能会有所帮助
答案 13 :(得分:0)
使用 IN 条件或 OR 条件尝试您的任务,此查询也适用于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';
答案 14 :(得分:0)
我遇到了同样的问题,我觉得这很有用。
mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");
记得把$ user放在''单引号中。
答案 15 :(得分:0)
SELECT user_name
FROM
(
SELECT name AS user_name
FROM users
) AS test
WHERE user_name = "john"
答案 16 :(得分:0)
据我所知,在MS-SQL 2000/5中。我过去曾犯过这种罪行。
答案 17 :(得分:0)
虽然您可以在查询中对表进行别名(即“SELECT u.username FROM users u;”),但您必须使用您引用的列的实际名称。 AS仅影响字段的返回方式。