2011-02-10 11 views
8

Ordina per è dinamico ma l'ordinamento è statico.Oracle dinamico DESC e ASC in ordine di

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 

Ora ho bisogno di fare in modo che l'ordinamento è anche dinamica. C'è un modo per rendere dinamico l'ordinamento nella query sopra?

risposta

14

Se vuoi anche per rendere l'ordinamento (ASC/DESC) dinamica, si potrebbe procedere come segue:

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 

con una variabile l_so che contiene 1 o -1 a seconda di quale tipo di ordinamento che si desidera .

+0

Il tuo mago .. –

+0

Expiry_Date è una colonna datetime. Il metodo sopra non funziona per quello. –

+1

@Aseem: potresti avere due CASE per il tuo ordine data (uno per ASC, uno per DESC) o convertire la data in un numero (di giorni) e utilizzare la variabile per scegliere l'ordine corretto. –

7

questo funziona per me:

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 

o

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 

sostituire letterali, variabili e nomi di colonna con quelli specifici per la vostra situazione. Oracle sembrava essere molto esigente riguardo al posizionamento del qualificatore della direzione di ordinamento desc.

Problemi correlati