2013-07-11 52 views
3

我一直在嘗試查找一段時間,如果可以在選擇語句中使用早些時候陳述的別名,如果它可以在稍後的case SQL語句。我發現的大多數結果都是關於如何根據case語句創建別名,這不是同一個問題。一個簡單的例子是這樣的:在Oracle SQL語句部分的情況下使用別名

Select TABLEA.SomeIDNumber AS "Id", 
     case ID 
      when 3 
      then 'foo' 
      else 'bar' 
     end AS "Results" 
FROM OMEGA.TABLEA 

這真的不是在SQL語句我創建(它是基於以前的case語句實際創建,需要一些聯接上各種表做全等簡單但是如果不知道更多我不能分享的數據庫,它就沒有意義了)。

我只是想知道是否可以在Oracle的select語句中稍後在case語句中使用別名(我知道這些事情可以用Access kinda「SQL」完成)。或者,對我來說,做一些對select進行重構以使其嵌套select語句更好?可能是可行的,只是多一點痛苦。

回答

5

不,您不能在select的其他地方引用別名,而不是在order by子句中,因爲Oracle在內部分配它的時間。

From the documentation(強調):

您可以使用列別名,c_alias,來標記立即 前面的表達式在選擇列表中,這樣的列是一個新的標題顯示 。別名在查詢期間有效地重命名選擇 列表項。 該別名可用於 ORDER BY子句中,但不包括查詢中的其他子句。

你需要使用一個內部查詢,像:

select "Id", 
    case "Id" 
     when 3 
     then 'foo' 
     else 'bar' 
    end AS "Results" 
from (
    select TABLEA.SomeIDNumber AS "Id", 
    from TABLEA 
); 
+0

啊,哦,我想我必須這樣做。這將使這個SQL查詢很有趣。謝謝。 –

+0

應該跟進,如果案件調用另一個表作爲嵌套選擇內部的連接,你是否必須在頂部選擇上做另一個連接,或者你可以從內部select中的表中調用信息嗎? 從來沒有完全做過像這樣的選擇(維護得不好的數據庫讓我覺得這很荒謬:/) –

+0

@ TheGodEm皇帝 - 呃,我不太確定我遵循。你直接引用一個表中的內部選擇,因爲你只是使用結果集;你需要在外層加入一個新的連接。但通常我會嘗試公開外部選擇中需要的連接表中的任何值,方法是將它們包含在內部查詢的選擇列表中;它們不必出現在外部查詢的選擇列表中,但仍然可以引用。可能有問題阻止了這一點,這取決於實際的查詢。 –