DB/Oracle
[Oracle] 특정 값 우선 정렬하기 ORDER BY DECODE/ORDER BY CASE
꾹꾹이
2022. 2. 9. 22:31
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를 더 자주 사용하게 될 것 같다.