2012-03-26 11 views
7

を抽出するので、私は=このwhere句のselect句の列番号を使用します。 allias元の名前

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

のようなクエリがSELECTED.1 = 1のようなものを入力するか、何らかの形でDので、元の名前alliasを抽出することが可能と代わりの = 1です持って言うことができます1が機能しない

+3

なぜこれをやりたいですか? –

+1

@ JohnSaundersなぜなら、エイリアス化されているものは複雑な式なので、where句で繰り返す必要はないからです。 –

答えて

10

WHERE句が評価されるときの内部的な複雑さのためにこれを行うことはできません。しかし、あなたがエイリアシングしていることが、あなたがむしろ繰り返すことのない長い表現であれば、これに対する典型的な解決策があります。 https://forums.oracle.com/forums/thread.jspa?threadID=1107532から:

これまでの標準的なソリューションです、あなたがで、別名を使用して、(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 
関連する問題