繁体   English   中英

Where 子句中的未知列

[英]Unknown Column In Where Clause

我有一个简单的查询:

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

Unknown Column 'user_name' in where clause得到了Unknown Column 'user_name' in where clause 即使在select 'u_name as user_name'之后,我也不能在语句的其他部分引用'user_name' select 'u_name as user_name'吗?

SQL 从右到左向后求值。 所以 where 子句在 select 子句之前被解析和评估。 因此,尚未发生 u_name 到 user_name 的别名。

关于什么:

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

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

“可以使用 AS alias_name 为 select_expr 指定一个别名。别名用作表达式的列名,并且可以在 GROUP BY、ORDER BY 或 HAVING 子句中使用。”

(……)

不允许在 WHERE 子句中引用列别名,因为在执行 WHERE 子句时可能尚未确定列值。 请参见第 B.5.4.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 子句。

如果您尝试执行如下查询(找到所有节点,至少有一个附件),您使用 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 不应该在未知别名处出错。

WHERE子句不欢迎您定义的alias ,您必须为此使用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'

任何一个:

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 支持将谓词推入内联视图,则后者应该与前者相同。

更正:

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

不,您需要使用正确的名称选择它。 如果您提供了从别名中选择的表格,则可以使用它。

你不能。 user_name 直到返回时间才存在。

由第 1 行和第 2 行引起并由第 3 行解决的WHERE子句中的未知列:

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

可能会有所帮助。

你可以

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

有用。

但要确保你做什么!

  • 此处不使用索引
  • 将扫描 FULL TABLE - 您尚未指定 LIMIT 1 部分
  • 所以, - 这个查询在大桌子上会很慢。

但是,在某些情况下可能会有所帮助

虽然您可以在您的查询中为您的表命名(即“SELECT u.username FROM users u;”),但您必须使用您所引用的列的实际名称。 AS 仅影响字段的返回方式。

据我所知,在MS-SQL 2000/5中。 过去我对此一直犯规。

刚遇到这个问题。

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

例如“user_name”而不是“user_name”

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

使用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';

对我来说,问题的根源是我复制到 WHERE 子句中使用的一个数字。 该数字具有“隐形”符号,至少对于 MySQL Workbench 而言是这样。 我将数字放在 Chrome 控制台中,它清晰可见。

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

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

记住将 $user 放在 ' ' 单引号中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM