메뉴 건너뛰기

조회 수 8395 추천 수 0 댓글 0
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄
?

단축키

Prev이전 문서

Next다음 문서

크게 작게 위로 아래로 댓글로 가기 인쇄

해당컬럼이 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;


List of Articles
번호 제목 날짜 조회 수
21 TOAD 에서 SQL Builder 을 사용하여 DML 문서 작성을 자동화 해본다 file 2016.08.30 7567
20 Toad 사용시 캐릭터 인코더 UTF-8 로 변경하기 file 2016.08.30 10168
» Oracle 에서 NVL, NVL2 함수 사용하는 예제 2016.08.30 8395
18 rownum 으로 범위지정을 해주고 싶을 때 2016.08.30 8680
17 Oracle 시퀀스 생성, 추가, 삭제 file 2016.08.30 8220
16 TOAD 에서 Edit 를 통해 sql문을 작성할때 참고해야할 View file 2016.08.30 7521
15 UNION ALL 과 ORDER BY 섞어서 쓰기 2016.08.30 9967
14 오라클(Oracle) 대용량 데이터 토드(Toad)를 이용해서 넣기 file 2016.08.30 8098
13 간단한 쿼리로 일련번호 쉽게 넣기 - ROWNUM 사용 file 2016.08.29 9587
12 Oracle에서 ORA-28000: 계정이 잠금되었습니다. - 해결 방법 file 2016.08.29 7376
11 WHERE절에서 Null 값 비교하기 file 2016.08.29 9400
10 Oracle에서 Foreign Key가 걸려있는 컬럼값 업데이트(update) 하기 file 2016.08.29 9228
9 Oracle에서 사용자가 생성한 모든 Table, View를 삭제하는 쿼리 만들기 file 2016.08.29 7522
8 Oracle에서 세자리 콤마 찍기 file 2016.08.29 11798
7 Merge into를 이용해서 insert나 update를 자동으로 실행하자. 2016.08.29 7749
6 조건절에 WHERE 1=1, WHERE 1=0 사용하여 쿼리 간편하게 사용하기 file 2016.08.29 9690
5 Oracle에서 중복 조인을 피하기 위한 Update 방법 (MERGE 사용) 2016.08.29 8199
4 단일행을 다중 row로 분리, 다중 row 결과를 단일행으로 연결하는 방법 2016.08.29 9470
3 WITH문으로 쿼리를 임시테이블이나 View처럼 사용하자. 2016.08.29 8421
2 Oracle 저장 프로시저 샘플 2016.08.29 7283
Board Pagination Prev 1 2 3 4 5 6 7 Next
/ 7

하단 정보를 입력할 수 있습니다

© k2s0o1d4e0s2i1g5n. All Rights Reserved