2011-02-10 26 views
8

順序は動的ですが、ソート順序は静的です。Oracle動的DESCおよびASC

SELECT ... 
Order By CASE WHEN InputParam = 'PRICE' THEN OFFER_PRICE END DESC, 
     CASE WHEN InputParam = 'ENDING SOON' THEN EXPIRY_DATE END DESC, 
     CASE WHEN InputParam = 'DISCOUNT' THEN DISC_PERCENTAGE END DESC, 
     CASE WHEN InputParam = 'SAVING' THEN SAVING END DESC 

ここで、ソート順も動的であることを確認する必要があります。上記のクエリでソート順を動的にする方法はありますか?あなたが望むどのソート順に応じて、1または-1を含む変数l_so

SELECT ... 
Order By CASE WHEN InputParam = 'PRICE' THEN l_so * OFFER_PRICE END, 
     CASE WHEN InputParam = 'ENDING SOON' 
       THEN l_so * (SYSDATE - EXPIRY_DATE) END, 
     CASE WHEN InputParam = 'DISCOUNT' THEN l_so * DISC_PERCENTAGE END, 
     CASE WHEN InputParam = 'SAVING' THEN l_so * SAVING END 

答えて

14

あなたもソート順序(ASC/DESC)は、動的にしたい場合は、次のことを行うことができます。

+0

あなたの魔法使い.. –

+0

Expiry_Dateは日時の列です。上記の方法はそのためには機能しません。 –

+1

@Aseem:日付オーダー(ASCの場合は1つ、DESCの場合は1つ)に2つのケースを持つか、日付を日数に変換して、変数を使用して正しいオーダーを選択することができます。 –

7

これは私の作品:

order by 
    case when :dir_param = 'ASC' then 
    case :col_param 
     when 'col_1_identifier' then col_1_name 
     when 'col_2_identifier' then col_2_name 
     ... 
    end 
    end, 
    case when :dir_param = 'DSC' then 
    case :col_param 
     when 'col_1_identifier' then col_1_name 
     when 'col_2_identifier' then col_2_name 
     ... 
    end 
    end desc 

または

order by 
case when :dir_param = 'ASC' and :col_param = 'col_1_identifier' then col_1_name end, 
case when :dir_param = 'DSC' and :col_param = 'col_1_identifier' then col_1_name end desc, 
case when :dir_param = 'ASC' and :col_param = 'col_2_identifier' then col_2_name end, 
case when :dir_param = 'DSC' and :col_param = 'col_2_identifier' then col_2_name end desc 

はリテラル、あなたの状況に固有のものと変数名とカラム名を交換してください。オラクルは、descソート方向修飾子の配置について非常に厄介なようでした。

関連する問題