DB/Oracle

[Oracle] 특정 값 우선 정렬하기 ORDER BY DECODE/ORDER BY CASE

꾹꾹이 2022. 2. 9.
728x90

 

데이터를 정렬할 때 일반적으로 ORDER BY 함수를 사용한다.

하지만 더 복잡한 정렬 방식에는 적합하지 못한 함수이다.

 

가령 정렬을 사용하되,

특정 데이터 값은 가장 상단에 보여주고 나머지 데이터만을 정렬해야 할 때는 ORDER BY를 사용할 수 없다.

 

이해를 돕기위해 예제를 보자.

 

 

위와 같은 데이터가 존재한다고 가정하자. 

이 데이터를 유통기한 별로 정렬하면

 

1
2
3
SELECT STOCK_CD, STOCK_NM, EXPI_DT, DELV_STATUS
  FROM ORDER_TABLE
ORDER BY EXPI_DT;
cs

 

이렇게 정렬이 가능하다.

 

그런데 여기서 배송 완료된 상품은 최상단으로 올리고 나머지 데이터만 정렬하고자 한다면?

ORDER BY DECODE 를 사용하면 가능하다.

예시를 드는 것이 가장 이해가 빠르므로 바로 예시...

 

1
2
3
SELECT STOCK_CD, STOCK_NM, EXPI_DT, DELV_STATUS
  FROM ORDER_TABLE
ORDER BY EXPI_DT DECODE(DELV_STATUS, '배송완료'1,2), EXPI_DT;
cs

DECODE 안에 인자를 넣으면 된다.

물론 인자를 여러 개 사용할 수도 있다.

 

1
2
3
SELECT STOCK_CD, STOCK_NM, EXPI_DT, DELV_STATUS
  FROM ORDER_TABLE
ORDER BY EXPI_DT DECODE(DELV_STATUS, '배송완료'1'배송중',2), EXPI_DT;
cs

 

자매품으로 ORDER BY CASE 도 있다.

1
2
3
SELECT STOCK_CD, STOCK_NM, EXPI_DT, DELV_STATUS
  FROM ORDER_TABLE
ORDER BY EXPI_DT CASE(DELV_STATUS WHEN '배송완료' THEN 1 WHEN '배송중' THEN 2 ELSE 3), EXPI_DT;
cs

 

개인적으로는 DEOCDE 가 더 보기 편해서 CASE 보다 DECODE를 더 자주 사용하게 될 것 같다.

댓글