SQL 함수2

to_char - 말 그대로 char 로 바꿔주는 함수

바꿀 때 포맷도 줄 수 있느데, 몇개 예를 들어보면

day 는 요일을 반환하고, d 는 일수(?)를 반환한다.
뭐냐하면, 일요일부터 토요일까지 1~7까지의 숫자를 반환한다.
일요일은 1, 월요일은 2, 금요일은 6 이런식으로 반환한다

 select hiredate, to_char(hiredate,'day'), to_char(hiredate,'d')
   from emp;

HIREDATE  TO_CHAR(HIREDATE,'DAY') TO_CHAR(HIREDATE,'D')
---------------------------------------------------------------------
1980-12-17               수요일                             4
1981-02-20               금요일                             6
1981-02-22               일요일                             1
.......


또, 숫자형식도 지정해 줄 수 있는데

 select ename, to_char(sal, '$999,999.00')
   from emp;

ENAME TO_CHAR(SAL,'$999,999.00')
-----------------------------------
SMITH               $800.00
ALLEN            $1,600.00
WARD             $1,250.00
.......


'L999,999.00' 으로 하면 현재 로컬의 화폐단위로 출력해준다.
우리나라는 '\'으로 표시되겠지?!


nvl - null 을 대체해서 출력해주는 함수
nvl(1,2) - 1이 null 이면 2 출력

emp 테이블에서 comm이 null 인 사원들은 0으로 출력

select ename, nvl(comm, 0)
  from emp;

ENAME      NVL(COMM,0)
-----------------------
SMITH                0   
ALLEN              300
WARD               500
.......


첫번째 인자는 null 인지 체크할 컬럼이나 데이터
두번째 인자는 null 일시 바꿀 표현, 첫번째 인자와 데이터형이 같아야 한다.

예를 들면, 위와같은 데이터가 있는데 null 을 'no comm' 으로 출력하려면

 select ename, nvl(comm, 'no comm')
   from emp;
  
이렇게 하면 '수치가 부적합합니다' 라는 오류 메시지를 볼 수 있을 것이다.
그래서, 첫번째 인자와 데이터형이 같게 해줘야하는데 다음과 같이 하면 된다.
위에서 공부한 to_char 함수를 써서

select ename, nvl(to_char(comm), 'no comm')
   from emp;

ENAME NVL(TO_CHAR(COMM),'NOCOMM')
------------------------------------------
SMITH                      no comm
ALLEN                          300
WARD                           500
.......

원하는 결과를 얻을 수 있다.


nvl2(1,2,3) - 1이 null 이 아니면 2출력
                   1이 null 이면 3출력

comm 이 null 아니면 sal+comm 을 출력하고 null 이면 그냥 sal 을 출력하게 하려면..

select ename, sal, comm, nvl2(comm, sal+comm, sal) incomm
  from emp;

ENAME    SAL     COMM      INCOMM
--------------------------------------
SMITH     800                          800
ALLEN    1600       300            1900
WARD     1250       500            1750
.......


nullif(1,2) -
1과 2를 비교해서 같으면 null 출력
                        같지 않으면 1을 출력

이름길이와 직업길이가 같으면 null 출력, 같지 않으면 이름의 길이를 출력하려면...

select ename, length(ename), job, length(job),
    nullif(length(ename), length(job)) result
  from emp;

ENAME LENGTH(ENAME)     JOB      LENGTH(JOB)     RESULT
------------------------------------------------------------------------
SMITH              5              CLERK              5
ALLEN              5          SALESMAN           8                  5
WARD               4          SALESMAN           8                  4
.......


coalesce(1,2,3) -
1이 null 이 아니면 1출력
1이 null 이면 2출력
1과 2가 null 이면 3출력

이 함수는 계속해서 나열할 수 있는데 여기서는 3까지만... ㅡ,.ㅡ;

예는 그냥 간단하게들자면

coalesce(comm, sal, 10) 이렇게 하면 먼저 첫번째 인자인 comm 을 체크해서
comm 이 null 이 아니면 comm 을 출력하고 comm 이 null 이면
두번째 인자인 sal 을 체크해서 sal 이 null 이 아니면 출력하고 null 이면
세번째 인자를 체크하는데 세번째는 10 이니까 그냥 출력하게 된다.
10이 아니라 뭔가 다른 컬럼이 있어서 체크할 게 있다면 체크하고, 계속 이렇게 나열해 가면서
null 을 체크하게 된다.


decode - if-else 와 같은 처리를 해주는 함수
if - else 는 분기를 줘서 각각의 처리를 해주는 것인데, 예와 같이 보면 쉽다.

월급을 인상시켜줄 건데, 직업이 SALESMAN 이면 월급을 20%인상하고,
ANALYST 이면 40% 인상하고 나머지는 그냥 월급이 나오게 해서,
이름, 직업, 월급, 인상된 월급을 출력하려면.

select ename, job, sal, 
           decode(job, 'SALESMAN', sal*1.2,
                             'ANALYST', sal*1.4,
                                               sal) increase
  from emp;

ENAME          JOB                 SAL       INCREASE
-------------------------------------------------
SMITH         CLERK                800           800
ALLEN     SALESMAN            1600         1920
WARD      SALESMAN            1250         1500
.......


decode 에서 첫번째 인자는 체크할 컬럼, 두번째는 비교할 값,
세번째는 두번째 비교 결과에서 참이면 처리할 문,
두번째-세번째 반복(즉, 네번째는 다시 비교할 값, 다섯번째는 처리문), 마지막은 디폴트 값이다.

위와 동일한 것을 case 문으로 바꾸면

select ename, job, sal,
         ( case job when 'SALESMAN' then sal*1.2
                       when 'ANALYST' then sal*1.4
                       else sal end ) increase
  from emp;

case  when then  else end 식으로 문장을 만들면 된다.
case when job='SALESMAN' then sal*1.2  와 같은 식으로 써줘도 된다.
같은 job 컬럼 아래 여러가지 직업이 있으니까 하나로 빼줘서
case job when 'SALESMAN' then sal*1.2 이런 식으로 해준건데
여러 컬럼을 가지고 비교해야한다던지, 여러 표현식을 써야한다면
case when 표현식 then 처리문 else 처리문 end
이렇게 하면 된다.

다음은 그룹함수~~--;

'SQL > 공부' 카테고리의 다른 글

SQL - 조인  (0) 2007.12.07
SQL 함수3  (2) 2007.11.29
SQL - 함수  (0) 2007.11.26
SQL 2강  (0) 2007.11.23
SQL 1강  (0) 2007.11.23