2014-06-09 2 views
0

활동 테이블 기간은입니다. 기간은 1m, 4m, 8m ... 같은 달에있을 수 있습니다. 또는 2y, 5y, 9y 등의 년 수 있습니다. 내 쿼리에서 내림차순 오름차순으로 내림차순으로 작성하고 싶습니다. 다음은 나의 질문입니다.조건에 따라 Oracle DB 쿼리 결과를 정렬하는 방법은 무엇입니까?

SELECT ACTIVITY 의해 2

전통적인 순서 BY 활동

ORDER FROM DURATION는 1m, 2Y, 4m, 5Y, 8m, 9Y로 결과를 리턴한다. 대신 결과를 1m, 4m, 8m, 2y, 5y, 9y로 원합니다.

어떻게하면됩니까? 귀하의 경우에 일반 및 특정

답변

1

:

select blablabla from activities 
order by decode(substr(col, len(col)-1, 1), 'm', 1, 'y', 12, 0)* 
to_number(substr(col, 1, len(col)-1) 

또는 (직접) (위치)

select blablabla from activities 
order by instr(col, '1m,4m,8m,2y,5y,9y') 

또는 (일반, 간단하지만)

select blablabla from activities 
order by decode(col, '1m', 1, '4m', 2, '8m', 3, '2y', 4, '5y', 5, '9y', 6, 7) 

또는

select blablabla from activities 
order by substr(col, len(col)-1, 1), substr(col, 1, len(col)-1) 
0

"사과와 사과"를 비교할 수 있도록 월 또는 일로 값을 변환하는 것이 좋습니다. 몇 달 또는 몇 해를 곱하여 Select 문에서 쉽게 처리 할 수 ​​있어야합니다 (불행히도이 시나리오에서는 30/31/x 일에 365 일을 해결해야합니다. 도약은 처리되지 않습니다.) 특정 날짜를 사용할 수 없으므로).

0

SUBSTR을 사용하여 단위를 확인하고, 나머지를 정수 단위로 캐스팅하여 정렬 할 수 있습니다.

SELECT ACTIVITY,DURATION FROM ACTIVITIES 
ORDER BY 
    CASE WHEN SUBSTR(DURATION, -1, 1) = 'y' 
     THEN CAST(SUBSTR(DURATION, 1, LENGTH(DURATION)-1) AS INT) * 12 
     ELSE CAST(SUBSTR(DURATION, 1, LENGTH(DURATION)-1) AS INT) 
     END; 

An SQLfiddle to test with.

0
SELECT activity, duration 
FROM (SELECT activity, 
       duration, 
       substr(duration, length(duration)) unit, 
       to_number(substr(duration, 1, length(duration) - 1)) VALUE 
      FROM activities) 
ORDER BY unit, VALUE; 
관련 문제