2011-02-10 30 views
8

El orden por es dinámico pero el orden de clasificación es estático.Oracle dinámico DESC y ASC en orden por

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 

Ahora necesito asegurarme de que el orden de clasificación también sea dinámico. ¿Hay alguna forma de hacer un orden de clasificación dinámico en la consulta anterior?

Respuesta

14

Si también quiere hacer el orden de clasificación (ASC/DESC) dinámico, se puede hacer lo siguiente:

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 variable l_so que contiene 1 o -1 dependiendo de qué orden de clasificación que desea .

+0

Su mago .. –

+0

Expira_Date es la columna de fecha y hora. El método anterior no está funcionando para eso. –

+1

@Aseem: puede tener dos CASE para su Orden de fecha (uno para ASC, uno para DESC) o convertir su fecha en un número (de días) y usar la variable para elegir el orden correcto. –

7

Esto funciona para mí:

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 

reemplazar literales, variables y nombres de las columnas con las específicas de su situación. Oracle parecía ser muy exigente con la ubicación del calificador de dirección de clasificación desc.

Cuestiones relacionadas