조회 쿼리를 이용 할 때, 단순히 오름차와 내림차순 정렬이 아니라
정렬을 하되 우선적인 값을 제일 상단에 조회하고 그 후 정렬을 하던지 등
원하는 특정 조건을 기준으로 잡아 정렬을 해야하는 경우가 있다.
방법은 그리 복잡하지 않으니 예제를 보면서 이해해보도록 하자.
먼저 아래와 같은 주문테이블이 있다고 가정한다.
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 를 사용하길 권하고 있다.
'Coding Story > DATABASE' 카테고리의 다른 글
[ Oracle ] 오라클 Sql UNION과 UNION ALL? (2) | 2021.01.06 |
---|---|
[ Oracle ] 오라클 문자 함수 LPAD, TRIM, LTRIM, SUBSTR 등 (0) | 2020.12.16 |
[ Oracle ] 오라클 숫자 함수 ABS, FLOOR, ROUND, TRUNC 등 (0) | 2020.12.16 |
[ Oracle ] 오라클 INSERT, UPDATE, DELETE 문법 (0) | 2020.12.16 |
[ Database ] SQLD DB 계층형 질의 (4) | 2020.10.29 |