[오라클(ORACLE)/SQL] 디코더 (DECODE) , 케이스 (CASE WHEN) 쿼리문 활용하기
개발자를 위한 데이타베이스(DB) 프로그래밍에 필요한 레퍼런스들을 정리해 두고 있습니다.
이전의 포스팅 자료들에 이어 이번에는 오라클이나 MySQL과 같은 SQL 데이타베이스(DB) 프로그램에서 디코더 (DECODE) 와 케이스 (CASE WHEN) 문에 대해 알아 보겠습니다.
또한,
디코더 (DECODE) 로 작성된 쿼리를 케이스 (CASE WHEN) 문을 사용한 쿼리로 대체하는 법을 소개합니다.
[오라클(ORACLE)/SQL] WHERE IN, CASE WHEN THEN END, GROUP BY, DISTINCT, MAX
[오라클(ORACLE)/SQL] 유니온(UNION) 서브(Sub)쿼리 중복제거 최신건 페이징 처리
[오라클(ORACLE)/SQL] DB 최적화를 고려한 다건조회 페이징처리
[오라클(ORACLE)/SQL] Oracle(오라클) 다건 조회시 쿼리문
DECODE 는 간단히 말하자면 C나 JAVA의 IF 분기 구문의 축약판 이라고 생각하시면 이해가 빠릅니다.
DECODE ( A, B, C, D )
A는 대상변수 B는 대상변수가 만족해야할 조건이며,
C는 A == B가 같을 경우의 결과값,
D는 A != B 일 경우의 결과값 입니다.
CASE WHEN 의 사용법은 C나 JAVA의 CASE문과 유사 합니다.
백문이 불여일견 이라고하니 쿼리 보고 이야기해 봅시다.
아래의 예제 쿼리(Query)에서 원하는 결과는
tb_cs_jh_ch_cduglimbrk 라는 테이블에서 ug_lim_mbdy_dsc 필드값이 각각 1, 2, 3 의 조건을 만족하는 레코드의 갯수를 각각 구해 ug_lim_mbdy_cnt1, ug_lim_mbdy_cnt2, ug_lim_mbdy_cnt3 이란 필드명을 사용하여 출력하는 것입니다.
* DECODE 를 사용한 SQL 쿼리
SELECT sum( decode(ug_lim_mbdy_dsc,'1',1,0) ) AS ug_lim_mbdy_cnt1
,sum( decode(ug_lim_mbdy_dsc,'2',1,0) ) AS ug_lim_mbdy_cnt2
,sum( decode(ug_lim_mbdy_dsc,'3',1,0) ) AS ug_lim_mbdy_cnt3
FROM tb_cs_jh_ch_cduglimbrk
WHERE tup_c = 'N10001';
AND apl_st_dt >= :apl_st_dt
AND apl_ed_dt <= :apl_ed_dt
아래는 DECODE 문으로 구현된 위의 쿼리를 CASE WHEN을 사용하여 구현해 본 대체 쿼리문 입니다.
CASE문으로 조건과 일치하는 값들의 전체 수를 구하기 위해 서브쿼리(SUB-Query)를 사용하였고 외부에서 카운트(COUNT) 해 주었습니다.
* CASE WHEN 을 사용한 SQL 쿼리
SELECT
count(ug_lim_mbdy_dsc_1) AS ug_lim_mbdy_cnt1
,count(ug_lim_mbdy_dsc_2) AS ug_lim_mbdy_cnt2
,count(ug_lim_mbdy_dsc_3) AS ug_lim_mbdy_cnt3
FROM (
SELECT
case when ug_lim_mbdy_dsc = '1' then '1' end AS ug_lim_mbdy_dsc_1
, case when ug_lim_mbdy_dsc = '2' then '2' end AS ug_lim_mbdy_dsc_2
, case when ug_lim_mbdy_dsc = '3' then '3' end AS ug_lim_mbdy_dsc_3
FROM tb_cs_jh_ch_cduglimbrk
WHERE tup_c = 'N10001'
AND apl_st_dt >= :apl_st_dt
AND apl_ed_dt <= :apl_ed_dt
);
두 쿼리문 다 아래처럼 같은 결과값을 보여줍니다.
(물론 3 ,7, 23은 임의의 값이고 출력값은 테이블에 들어있는 레코드의 수에 따라 달라지겠습니다.)
ug_lim_mbdy_cnt1 |
ug_lim_mbdy_cnt2 |
ug_lim_mbdy_cnt3 |
3 |
7 |
23 |
우리가 원하는 대로 ug_lim_mbdy_dsc 필드값이 각각 1 ,2 ,3 을 가진 레코드의 갯수가 출력되었습니다.
어떤 함수를 사용하든지 원하는 결과를 출력하는 쿼리를 만드는 것에 정석은 없습니다.
다만..
그때그때의 상황에 따라 원하는 결과물에 맞는 최적의 SQL 함수와 쿼리문를 선택하면 될 것입니다.