未知列在where子句(Unknown Column In Where Clause)

2019-07-21 09:36发布

我有一个简单的查询:

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'

Answer 1:

SQL向后评估,由右至左。 所以在where子句被解析并先于SELECT子句评估。 由于u_name的这种混叠到USER_NAME尚未发生。



Answer 2:

请参阅下面的MySQL手册页: http://dev.mysql.com/doc/refman/5.0/en/select.html

“A select_expr可以给出使用AS ALIAS_NAME一个别名。别名用作表达式的列名,并且可以在GROUP BY,ORDER BY,或HAVING子句中使用。”

(......)

这是不允许指在WHERE子句中的列别名,因为可能会被执行WHERE子句时,尚未确定列值。 见B.5.4.4节,“问题与列别名”。



Answer 3:

关于什么:

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


Answer 4:

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子句。



Answer 5:

如果你想执行类似下面的查询(找到至少一个附件的所有节点),您已经使用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不应该博克在未知的别名。



Answer 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支持谓词推入在线视图。



Answer 7:

您定义的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'


Answer 8:

不,你需要用正确的名称来选择它。 如果你从一个别名给你选择的表,你可以使用,虽然。



Answer 9:

更正:

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


Answer 10:

你不能。 user_name是不存在的,直到返回时间。



Answer 11:

在未知列WHERE引起线路1和2子句和由3线解决:

  1. $sql = "SELECT * FROM users WHERE username =".$userName;
  2. $sql = "SELECT * FROM users WHERE username =".$userName."";
  3. $sql = "SELECT * FROM users WHERE username ='".$userName."'";


Answer 12:

可能是它帮助。

您可以

SET @somevar := '';
SELECT @somevar AS user_name FROM users WHERE (@somevar := `u_name`) = "john";

有用。

但要确保你做什么!

  • 索引是这里没有使用
  • 这里将被扫描全表 - 您还没有指定的限制1份
  • 所以, - 这个查询将SLLLOOOOOOW上巨大的表。

不过,可能是它有助于在某些情况下,



Answer 13:

只是有这个问题。

确保没有在数据库中的实体的名称没有空格。

例如,“USER_NAME”而不是“USER_NAME”



Answer 14:

虽然您可以在查询中的别名表(即“选择u.username来自用户的U;”),你必须使用你所引用的列的实际名称。 因为只有影响的领域是如何返回。



Answer 15:

还不如就我所知在MS-SQL 2000/5。 我已经爱上了这个犯规过去。



Answer 16:

SELECT user_name
FROM
(
SELECT name AS user_name
FROM   users
) AS test
WHERE  user_name = "john"


Answer 17:

我有同样的问题,我发现这非常有用。

mysql_query("SELECT * FROM `users` WHERE `user_name`='$user'");

记得把$用户“”单引号。



Answer 18:

试试你的任务使用IN条件或OR条件,也该查询正在火花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';


文章来源: Unknown Column In Where Clause