2011-02-10 2 views
8

순서는 동적이지만 정렬 순서는 정적입니다.오라클 동적 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 

이제 정렬 순서도 동적이어야합니다. 위 쿼리에서 정렬 순서를 동적으로 만들 수있는 방법이 있습니까?

답변

14

당신은 또한 정렬 순서 (ASC/DESC) 동적를 확인하려면 다음 작업을 수행 할 수 있습니다 : 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 

-1 따라하는 정렬 순서에 따라 원하는 .

+0

당신의 마술사 .. –

+0

Expiry_Date는 datetime 열입니다. 위의 방법은이를 위해 작동하지 않습니다. –

+1

@Aseem : 날짜 주문에 대해 두 개의 사례 (ASC, DESC 중 하나)를 사용하거나 날짜를 일 (일)로 변환하고 변수를 사용하여 올바른 순서를 선택할 수 있습니다. –

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 정렬 방향 한정자의 위치에 대해 매우 까다로운 것처럼 보였습니다.