簡體   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