본문 바로가기
Be Smart/SQL

[ Oracle ] 조건별로 우선 정렬하기 ORDER BY DECODE/CASE

by 반월하 2022. 4. 29.
728x90

조회 쿼리를 이용 할 때, 단순히 오름차와 내림차순 정렬이 아니라

정렬을 하되 우선적인 값을 제일 상단에 조회하고 그 후 정렬을 하던지 등

원하는 특정 조건을 기준으로 잡아 정렬을 해야하는 경우가 있다.

방법은 그리 복잡하지 않으니 예제를 보면서 이해해보도록 하자.

먼저 아래와 같은 주문테이블이 있다고 가정한다.

CREATE TABLE 주문테이블
( 
    주문일자  VARCHAR2(200 BYTE), 
    주문상품  VARCHAR2(200 BYTE), 
    주문상태  VARCHAR2(200 BYTE) 
); 

INSERT INTO 주문테이블 (주문일자, 주문상품, 주문상태) VALUES ('2021-01-20', '삼겹살'  , '배송중'  ); 
INSERT INTO 주문테이블 (주문일자, 주문상품, 주문상태) VALUES ('2021-01-12', '한우'    , '배송시작'); 
INSERT INTO 주문테이블 (주문일자, 주문상품, 주문상태) VALUES ('2021-04-05', '항정살'  , '배송완료'); 
INSERT INTO 주문테이블 (주문일자, 주문상품, 주문상태) VALUES ('2021-02-15', '목살'    , '배송중'  ); 
INSERT INTO 주문테이블 (주문일자, 주문상품, 주문상태) VALUES ('2021-03-10', '앞다리살', '배송시작'); 
INSERT INTO 주문테이블 (주문일자, 주문상품, 주문상태) VALUES ('2021-02-05', '등심'    , '배송완료');

 

이 주문테이블을 일자순으로 조회하되, 주문상태가 '배송시작'인 행을 제일 상단에 출력하고 싶다.

이는 ORDER BY 에  DECODE  CASE 를 사용하면 간단하게 구현할 수 있다.

 

ORDER BY DECODE

DECODE 는 프로그래밍에서의 IF~ELSE 조건문의 용도로 자주 쓰인다.

이러한 DECODE 를 ORDER BY 에 넣어 사용하면 조건에 맞는 우선순위를 부여할 수 있다.

DECODE 를 사용한 쿼리는 다음과 같다.

SELECT *
FROM   주문테이블
ORDER BY DECODE(주문상태, '배송완료', 1), 주문일자 ASC;

DECODE 의 인자 값으로 넣어준 세 가지 값을 해석하면, 주문상태가 '배송완료'이면 값 1 을 부여한다. 

이를 ORDER BY 에서 1 번 째 우선순위로 적용해 배송완료 행을 제일 상단에 출력한다.

그 후 주문일자순으로 오름차순으로 정렬한다.

결과는 다음과 같다.

 

ORDER BY CASE

그럼 이번엔 CASE 를 사용한 쿼리를 살펴보자.

SELECT *
FROM   주문테이블
ORDER BY (CASE WHEN 주문상태 = '배송완료' THEN 1 ELSE 2 END), 주문일자 ASC;

CASE 도 마찬가지로 '주문상태 = 배송완료' 조건이 참이면 1 순위로 거짓이면 2 순위로 정렬한다.

그 후 주문일자순으로 오름차순으로 정렬한다.

ORDER BY DECODE 를 사용하던, ORDER BY CASE 를 사용하던 별 상관은 없지만,

실무에서 굳이 사용하자면 DECODE 는 오라클에만 있기 때문에 CASE 를 사용하길 권하고 있다.

 

728x90

댓글