2011-07-07 4 views
2

関数を作成して名前を付けると、後でその名前を使用する方法がありますか?オラクルの識別子に関する質問

たとえば、以下のコードでは、私はsellprice-buypriceという名前をPROFITと指定しましたが、無効な識別子としてエラーが発生したため、再度使用することはできません。私がそれをすることができない場合は、私はどのように私はその列に最大利益のエントリを表示するか教えてください。

SELECT item, buyprice, sellprice, 
sellprice-buyprice as “PROFIT” 
FROM auctions 
WHERE PROFIT = (select MAX(PROFIT) from auctions); 
+0

マイナスカーカークターは識別子で承認されていますか? –

+0

@Luc M:実際には、マイナス演算子、 '' sellprice''から '' buyprice''を引いたものです。多少あいまいだと私は同意する。私自身はオペレータの周りのスペースを好みます。 –

+0

@Andriy私は昨年、Cobolのプログラミングをやめました。マイナス記号は変数名で表すことができます。私はまだいくつかの古い習慣を保持しています:-) –

答えて

2

あなたはこの文を試みることができる: select * from (select item, buyprice, sellprice, sellprice-buyprice as “PROFIT” from auctions order by 4 desc) where rownum = 1;

+0

それは1つの項目を返しましたが、最も高い利益を持つものは返しませんでした。 – Christopher

+0

私はそれが動作するようにステートメントを変更しました – dmirkitanov

+0

ありがとう!秒があれば、それがどのように終わるのか、私に説明してもらえますか? (オーダーとローブ部分) – Christopher

0

あなたは、where句で関数名を使用し、エイリアスを参照することが有効ではありません。

SELECT item, buyprice, sellprice, 
sellprice-buyprice as “PROFIT” 
FROM auctions 
WHERE sellprice-buyprice = (select MAX(PROFIT) from auctions); 

それとも、本当にまだあなたがサブクエリリファクタリングを介してこれを実現することができ、提案されているように、サブクエリを使用することに加えて、エイリアス

select item, buyprice, sellprice, profit 
from 
(
    SELECT item, buyprice, sellprice, sellprice-buyprice as “PROFIT” 
    FROM auctions) 
) 
WHERE PROFIT = (select MAX(PROFIT) from auctions); 
0

を使用したい場合は、以下の操作を行うことができます。

これをたくさん使って11gを使用している場合は、この計算を仮想列として定義することで永久に利用できるようにすることができます:

ALTER TABLE auctions ADD (profit AS (sellprice - buyprice)); 

SELECT item, 
     buyprice, 
     sellprice, 
     profit 
    FROM auctions 
WHERE profit = (SELECT MAX(profit) FROM auctions);