2011-02-10 15 views
8

Zamówienie według jest dynamiczne, ale porządek sortowania jest statyczny.Oracle dynamiczne DESC i ASC w kolejności według

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 

Teraz muszę się upewnić, że kolejność sortowania jest również dynamiczna. Czy jest jakiś sposób na zrobienie dynamicznego porządku sortowania w powyższym zapytaniu?

Odpowiedz

14

Jeśli też chcesz zrobić porządek (ASC/DESC) dynamiczny, można wykonać następujące czynności:

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 

o zmiennym l_so który zawiera 1 lub -1 w zależności od którego porządek chcesz .

+0

Twój czarodziej .. –

+0

Data wygaśnięcia to kolumna datetime. Powyższa metoda nie działa w tym celu. –

+1

@Aseem: możesz mieć dwie PRZYPADKI na swoją datę Zamówienie (jedną dla ASC, jedną dla DESC) lub przekonwertować datę na liczbę (dni) i użyć zmiennej, aby wybrać właściwą kolejność. –

7

Działa to dla mnie:

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 

lub

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 

zastąpić literałów, zmiennych i nazwy kolumn z tych specyficznych dla danej sytuacji. Wydaje się, że Oracle jest bardzo wrażliwy na umieszczanie kwalifikatora kierunku desc sort.

Powiązane problemy