Oracle/SQL

2012.01.03 SQL 2일차(2) 일반함수(nvl,nvl2,decode,case)

에몽이ㅋ 2012. 1. 9. 22:46

CASE 사용법 참조 : http://miae1216.blog.me/20133583579
일반함수

NVL(exp1, exp2)

; exp1이 NULL이면 exp2로 변경, (exp1, exp2는 반드시 같은 데이터타입)


NVL2(exp1, exp2, exp3)

; exp1이 NULL이 아니면 exp2,

NULL 이면 exp3


DECODE(exp, 조건1, 결과값1,

조건2, 결과값2,

, 결과값3)

; 오라클에서만 제공

exp가 조건1이면 결과값1 출력,

조건2면 결과값2 출력

조건에 맞지 않는 값이면 결과값3 출력(이 값이 없으면 조건에 맞지 않는 값은 NULL로 처리)

(, 의 사용에 주의하세요~)


CASE exp WHEN 조건식1 THEN result1

WHEN 조건식2 THEN result2

ELSE result3

END

; exp가 조건식1에 만족하면 result1,

조건식2에 만족하면 result2,

위 조건식에 만족하지 않는 값이면 result3

* DECODE는 조건과 일치하는('=') 것밖에 비교할 수 없지만 CASE는 조건식('>=', between 등등) 을 사용할 수 있습니다.

* CASE는 반드시 END를 써야 끝이 납니다. 반드시 END를 써주세요.

* CASE문중 일치하는 조건을 쓰는 CASE는 DECODE로 바꿔주세요.(DECODE가 속도가 빠릅니다.)

NVL2 예제 

학생의 이름, 지도교수 번호를 출력하여라. 단, 지도교수가 배정되지 않은 학생은 지도 교수 번호를 0000 으로 출력하여라.


SQL> select name,

  2 nvl2( to_char(profno), to_char(profno), '0000' ) "지도교수"

  3  from student;


NAME       지도교수번호

---------- ----------------------------------------

전인하     9903

이동훈     0000

박미경     0000

....

류민정     9907


16 rows selected.

(nvl2안에 to_char를 써준이유는 숫자타입에서는 '0000'을 출력하면 

'0'만 출력되기때문에 문자타입으로 변경해서 '0000'을 출력한 것입니다.)

 NVL 예제

  1  select name, sal,

  2  nvl(comm,10), comm

  3* from professor

SQL> /


NAME              SAL NVL(COMM,10) COMM

---------- ---------- ------------ ----------

김도훈            500           20               20

이재우            320           10

성연희            360           15               15

염일웅            240           10

권혁일            450           25               25

이만식            420           10

전은지            210           10

남은혁            400           17               17


8 rows selected.

DECODE 예제

 학생 전화번호의 지역번호가 ’02’이면 ‘서울’, ‘051’이면 ‘부산’,’052’이면 ‘울산’,' 053’이면 ‘대구’, 나머지는 ‘Etc’ 로 하여 학생이름,전화번호,지역명(Loc)을 출력하여라.


SQL> select name, tel,

  2  decode( substr(tel,1, instr(tel,')',1,1)-1),

  3  '02', '서울',

  4  '051', '부산',

  5  '052', '울산',

  6  '053', '대구',

  7  '기타') 지역명

  8  from student;


NAME       TEL           지역

---------- ------------- ----

전인하     051)781-2158  부산

이동훈     055)426-1752  기타

박미경     055)261-8947  기타

....

윤진욱     053)487-2698  대구

이광훈     055)736-4981  기타

김진경     052)175-3941  울산

조명훈     02)785-6984   서울

류민정     055)248-3679  기타


16 rows selected.

 CASE 예제

 교수 테이블에서 입사일이 1~4월인 모든 교수의 급여를 15% 인상하여 정수로 출력하되 절삭된 값을 출력하여라.


  1  select name, hiredate, sal,

  2  CASE WHEN to_char(hiredate,'mm') BETWEEN 1 and 4

  3     THEN to_char( trunc(sal*1.15) )

  4     ELSE '-'

  5  END "인상 후"

  6* from professor

SQL> /


NAME       HIREDATE         SAL            인상 후

---------- ------------ ---------- ----------------------------------------

김도훈     24-JUN-82           500                  -

이재우     12-APR-95           320                 368

성연희     17-MAY-93           360                 -

염일웅     02-DEC-98           240                  -

권혁일     08-JAN-86           450                 517

이만식     13-SEP-88           420                 -

전은지     01-JUN-01           210                  -

남은혁     18-NOV-90           400                 -


8 rows selected.