2012-03-26 34 views
7

所以,可以說,我有這樣的使用where子句中select子句的列號。提取allias原名

SELECT a as d,b,c FROM myTable 
    WHERE a=1; 

查詢是否有可能代替 A = 1鍵入類似SELECTED.1 = 1或以某種方式提取allias因爲d原來的名字= 1不起作用

+3

爲什麼要這麼做? – 2012-03-26 03:09:30

+1

@JohnSaunders,因爲也許別名是一個複雜的表達式,你不想在where子句中重複。 – 2012-03-26 03:14:56

回答

10

由於關於WHERE子句何時進行評估的內部複雜性,因此無法做到這一點。但是如果你正在使用別名的東西是一個你不想重複的長表達式,那麼就有一個典型的解決方案。從https://forums.oracle.com/forums/thread.jspa?threadID=1107532

標準的解決方案是,您將查詢到的直列 視圖(沒有where子句謂語),然後添加 where子句謂詞,使用別名,在外部查詢。

因此,像這樣:

select ... 
from (select ... here complex expression that is aliased ... 
     from ... 
     where) A 
where ... here condition that uses the A.alias column ... 

在您的例子的情況下,這將是:

SELECT d, b, c 
FROM (SELECT a AS d, b, c FROM myTable) AS myAliasedTable 
WHERE d = 1 

當然不過,這不會在你的文字例如是有意義的。如果你正在使用別名的東西只是一個列名,那麼只需在WHERE中使用實際的列名,在這種情況下沒有真正的缺點。

另請注意,如果確實使用此方法,則應該儘可能多地在WHERE子句中添加內部查詢(即不引用別名列的部分)以限制結果的大小別名錶。例如,如果你也想在你的例子來測試b,這將是:

SELECT d, b, c 
FROM (
    SELECT a AS d, b, c 
    FROM myTable 
    WHERE b = 1 
) AS myAliasedTable 
WHERE d = 1