2012-03-12 77 views
6

問題

我在查詢中使用備用列名(化名),我可以使用別名「GIVEN_NAME」作爲ORDER BY的一部分,但是無法使用它作爲其一部分WHERE子句。該WHERE「GIVEN_NAME」傳遞作爲我的控制的請求的結果,我不知道應該在WHERE條件下使用實際的列名。列別名WHERE子句

問題

  1. 這有什麼辦法/破解一個WHERE子句中使用列別名?
  2. 有沒有辦法找到一個別名列名?

研究

一些研究它看起來像別名是在WHERE子句後添加後後。

SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

回答

4

未經檢驗的,但這個技巧應該工作...

SELECT * FROM ( 
    SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
    FROM green_profile profile 
    LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
    LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1 
) as temptable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 

它的工作原理通過簡單地創建一個臨時表從您的原始選擇語句(沒有where子句和排序),其中有列na你指定的mes。然後,您可以從中選擇所需的列名。

一個更好的辦法是創建一個視圖,你想要的列名,並從視圖中選擇...

CREATE VIEW newtable AS 
SELECT profile.id AS id, given.name AS 'given_name', family.name AS 'family_name' 
FROM green_profile profile 
LEFT JOIN green_name given ON given.profileid = profile.id AND given.name_typeid = 0 
LEFT JOIN green_name family ON family.profileid = profile.id AND family.name_typeid = 1; 

然後......

SELECT * FROM newtable 
WHERE given_name LIKE 'levi%' 
ORDER BY given_name DESC LIMIT 0 , 25 
+0

謝謝,很好的解釋。然而,兩種解決方案都可以在對一張大桌子進行基準測試之後,視圖解決方案提供更好的性能 – 2012-03-12 10:12:35

+0

我懷疑可能是這樣,因爲這將只需要對視圖做充分的select語句一次,然後可以緩存和索引,以備日後調用(不知道這個細節是如何工作的)。我預計表現會稍好單指原始列名,而不是對付視圖中的所有在一起的,但是希望不是這麼大的差別。 – 2012-03-12 10:20:55

1

在懷疑,僅僅指的是通過列數:

... 
ORDER BY 2 
... 
+0

會不會是更好用全稱'given.name'?列順序並不是一個強有力的方法 – 2012-03-12 09:43:51

+0

這可以工作,但是由於客戶端請求超出了我的控制範圍,因此「given_name」被傳入。我無法確定列號或「given_name」是given.name的別名。 – 2012-03-12 10:16:14

3

你可以僅在GROUP BY,ORDER BY或HAVING子句中使用列別名。

標準SQL不允許你引用列別名WHERE子句。這種限制是因爲在執行WHERE代碼時,列值可能還沒有確定。