繁体   English   中英

MySQL在where子句中使用列别名

[英]Mysql use column alias in where clause

我有一个Mysql查询:

SELECT created_at as date FROM table

因此,我为created_at列创建了一个别名。 现在,我想在我的WHERE子句中使用此别名:

SELECT created_at as date FROM table WHERE date = 'xxxx-xx-xx'

这是行不通的。 Mysql希望我使用真实的列名。 有什么办法可以按照我的意愿去做吗?

背景:我正在从几个表中选择记录,并使用UNION它们UNION 所有表都有一个日期列,但每个表中的名称都不同。 但是我想在统一记录上执行WHERE操作,因此我需要始终使用相同的列名

如果您绝对必须使用别名作为选择条件的一部分,那么您需要使用HAVING而不是WHERE

SELECT created_at as date FROM table HAVING date = 'xxxx-xx-xx'

但是最好使用列名和WHERE因为其他人在阅读您的代码时会发现WHERE的含义比HAVING更明显; 而且它也不会有效地使用您的表索引

您问:“有什么方法可以按照我想要的方式进行吗?”

是的,但是需要使用子查询或视图。

SELECT date 
FROM  (SELECT created_at as date FROM table) B
WHERE date = 'xxxx-xx-xx'

以工会为例...

SELECT * from (
Select col1, col2,col3 as date from A
union
select col1, col4,col5 from B) inlineView
WHERE date = 'somedate'

您遇到的问题是数据库内的操作顺序。

  1. FROM子句
  2. WHERE子句
  3. GROUP BY子句
  4. HAVING子句
  5. SELECT子句
  6. ORDER BY子句

(顺序取自http://www.bennadel.com/blog/70-sql-query-order-of-operations.htm )找到了不同的顺序MySQL操作顺序?

所以现在我必须做一些研究来找出哪一个是正确的; 还是因RDBMS而异...

因此,在评估select之前执行where子句。 因此,它还不知道您是否对其进行了别名。 您可以通过执行子选择,使数据列在from子句中成为所需的方式来欺骗编译器。

哪里对别名不起作用..最好使用table_name.column_namem,您可以在group by中使用列的别名。

  SELECT created_at  FROM table WHERE table.created_at = 'xxxx-xx-xx'  <--more readable, isn't it?

暂无
暂无

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

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