해당컬럼이 null 일때, 소스에서 처럼 if 나 switch case 문법처럼 특정조건이 맞았을때
처리하는 DB 함수들에 관한 내용이다. 첫 시작은 NVL 함수이며 이와 관련된 지식들을
엮어 기술하였다.
1. NVL , NVL2 사용법
2. NVL 과 유사한 DECODE 사용법
3. MSSQL 에서의 CASE 문
4. ORACLE 에서의 CASE 문
Oracle 에서 NVL, NVL2 함수 사용하는 예제 |
오라클 DB 에서 데이터를 가져와 처리할 때 필드에 담긴 값이 null 인지 아닌지에 대한
판단을 하여 여러가지 처리를 하곤하는데 , 이것은 어플리케이션에 불필요한 소스를
추가하게 하는 요인이 된다.
그러므로 DB 쿼리에서 null 일때 적당한 값을 셋팅해서 처리를 해주면 소스에서 불필요한
내용을 없애줄수 있다. 그래서 많이 사용한다.
NVL, NVL2 함수가 그 역할을 한다, 두 함수의 차이는 NVL2 가 NULL 값이 아닐 때 셋팅하는
파라미터가 하나 더 있다.
NVL 함수 : 해당 컬럼의 null 값을 다른 값으로 치환해주는 함수
원형 : NVL (컬럼명, [null 값 대신 넣을 값])
NVL2 함수 : NVL 함수의 확장형으로 DECODE 함수와 유사
해당 컬럼의 값이 null 이거나 null 이 아닌 두가지 값으로 치환해준다.
원형 : NVL2 (컬럼명, [null 값이 아닐경우], [null 값일 경우])
NVL 함수에 대한 지식 확장 – DECODE 함수 |
치환에 관련된 유사한 예제의 함수중 DECODE 가 있다.
이것은 어플리케이션의 프로그램에서 사용하는 IF 문법처럼 적용이 가능한데 특정컬럼의 값을
기준으로 해서 구분한다. 그리고 else if 처럼 특정값일 때 셋팅해야될 값을 (key, value) 쌍으로
해서 여러 개 넣을수 있다.
그리고 마지막에는 해당하는 값이 없을 때 셋팅하는 값으로 넣으면 된다. 아래 예제를 보면
쉽게 이해할수 있을 것이다.
SELECT dname, job
decode(job, ‘analyst’, ‘분석가’,
‘clerk’, ‘점원’,
‘manager’, ‘관리자’,
‘사원’) AS new_job
FROM emp;
위 쿼리를 설명하자면 job 컬럼의 값이 ‘analyst’ 이면 ‘분석가’ 를, ‘clerk’ 이면 ‘점원’ 을 ,
‘manager’ 이면 ‘관리자’ 를 출력한다. 해당하는 값이 없다면 ‘사원’ 을 출력한다.
다른 사용방법으로 SUM 함수와 연계해서 특정값을 누적할수도 있다.
SUM(DECODE(Love, ’A’, 1, 0)) : love 가 ‘A’ 와 같다면 1을 누적하고 아니면 0 을 더한다.
이중 DECODE 문도 허용된다. 이것은 AND 연산과 같은 작용을 하는데 두조건이 일치해야한다.
DECODE(love, ‘A’, DECODE(name, ‘KIM’, 1), 0) : love 이 ‘A’와 같고 name 이 ‘KIM’ 이면 1 이된다.
아니라면 0 을 가지게 되는 것이다.
이 내용을 사용한 예제가 아래와 같다. 예제를 통해 확실히 익히도록 한다.
SELECT EMPNAME, SUM(DECODE(SUBSTR(EMPNAME,1,3),’KIM’,1,0)
+ DECODE(SUBSTR(EMPNAME,1,3),’LEE’,1,0))
FROM PA06MR0
WHERE SUBSTR(entondate,1,4) = ‘1998’
GROUP BY EMPNAME;
사원테이블(PA06MR0) 에서 영문성이 KIM 으로 시작하는 사람과 LEE 로 시작하는 사람의
합을 구하는데 단 입사년도가 올해 (1998) 인 사람의 합을 구하는 예제이다.
NVL 함수에 대한 지식 확장 – MSSQL 에서는 CASE 문을 사용한다. |
NVL 을 다시 확장시켜 MSSQL 에서 비슷하게 사용하는 CASE 문에 대해 살펴본다.
문법은 다음과 같다.
Simple CASE expression;
CASE input_expression
WHERE when_expression THEN result_expression[…n]
[ ELSE else_result_expression]
END
Searched CASE expression;
CASE
WHERE Boolean_expression THEN result_expression[…n]
[ ELSE else_result_expression]
Oracle 의 NVL 사용예제로 제시한 것을 CASE 문을 사용해서 바꿔보자.
SELECT dname, job
decode(job, ‘analyst’, ‘분석가’,
‘clerk’, ‘점원’,
‘manager’, ‘관리자’,
‘사원’) AS new_job
FROM emp;
MSSQL Case 문으로 변경했을 때 :
SELECT dname, new_job =
CASE job
WHEN ‘analyst’ THEN ‘분석가’
WHEN ‘clerk’ THEN ‘점원’
WHEN ‘manager’ THEN ‘관리자’
ELSE ‘사원’
END
FROM emp;
MSSQL 의 CASE 확장 – Oracle 에서 CASE 문 사용예제 |
MSSQL 에서 사용한 문법과 동일하다. DECODE 를 사용하기 보다 Case 문을 사용하면
DB 가 바껴도 소스를 고치는 일이 없을 것이다.
원형은 다음과 같다. 설명을 붙이자면 1번은 x=y 와 같다면 a, 아니면 b 라는 것이다.
2번은 XYZ 가 foo 이면 moo 가 되고 아니면 bar 이 된다.
1. case when x=y then a else b end
2. case XYZ when ‘foo’ then ‘moo’ else ‘bar’ end
예제는 다음과 같다.
SELECT a,
CASE
WHEN b=’*’ then ‘star’
WHEN b=’+’ then ‘plus’
WHEN b=’-’ then ‘minus’
ELSE ‘????’
END
FROM test_case_when;