2011-07-22 76 views
2

是否可以編寫使用已分配給列的列名稱而不是實際存在的列名稱的where語句?整個表是動態創建的,列名存儲在另一個表中。我有一個函數,允許用戶在檢索與之相關的一組數據之前將篩選器添加到工作中。什麼我試圖WHERE cast列名等於

例子:

SELECT id, 
    col1 as [description], 
    col2 as [date1], 
    col3 as [image], 
    col4 as [date2], 
    col5 as [link], 
    col6 as [location], 
    col7 as [price], 
    col8 as [title] 
FROM tableName 
WHERE [title] = 'Lemons' 
+2

你真的嘗試過嗎? –

+0

@Chris - 我不是OP,但我不確定你在這裏要求什麼。你問OP,如果上述確實不起作用?如果是這樣,答案是肯定的,它不起作用。 – IAmTimCorey

+0

我得到的是,將它插入並嘗試運行它會更快。 –

回答

4

讓你的原始查詢的子查詢:

SELECT * 
FROM (
    SELECT id, 
    col1 as [description], 
    col2 as [date1], 
    col3 as [image], 
    col4 as [date2], 
    col5 as [link], 
    col6 as [location], 
    col7 as [price], 
    col8 as [title] 
    FROM tableName 
) as subquery 
WHERE [title] = 'Lemons' 
3

基思的答案是正確的,但我會闡述在其所以然。您不能在WHERE子句中引用列別名。原因是基於系統處理命令的順序。我們看這個命令並從上往下看。但是,數據庫引擎基於一組語句來查看它。它首先讀取您的FROM語句以確定要訪問的表。然後它會讀取您的WHERE語句來確定要包含/排除哪些數據。最後,它會查看您的SELECT語句以確定要顯示的數據。

由於總體語句按此順序評估,因此WHERE語句無權訪問在SELECT語句中創建的別名,因爲這些別名尚未處理。因此,在WHERE語句中引用列別名不是嚴格可行的。解決這個問題的常用方法是將整個語句包裝在子查詢中。唯一的問題是你會遇到性能問題。原因是你將返回所有的行,然後消除一些,而不是在檢索之前進行消除。

+0

+1表示擊中表現 – Keith