2010년 5월 27일 목요일

SQL 공부 #6

------------------------------
 일반 함수
------------------------------

 # 문제 : 홀수, 짝수 표현하기

 -- decode함수
 -- 엑셀의 if함수처럼 쓰인다.
 -- decode([컬럼명], a1, a2, a3)
      : 컬럼의 값 a1이면 a2를 출력, 아니면 a3을 출력
 -- decode([컬럼명], a1, a2, a3, a4)
      : 컬럼의 값 a1이면 a2를 출력, a3이면 a4를 출력, ...
        이런식으로 계속 나감. 몇개까지 가능하지?

    select empno, mod(empno, 2), decode(mod(empno, 2), 0, '짝수', '홀수') as ret                   --> decode 함수
    from emp;

 --empno를 2로 나눈 나머지를 리턴
 --리턴된 값이 0이면 '짝수', 아니면 '홀수'를 리턴
 --column alias를 왜 ret이라고 했지?

    select empno, mod(empno, 2), case mod(empno, 2) when 0 then '짝수'                             --> simple case 표현식
                                                    else        '홀수'
                                 end as ret
    from emp;
 -- case문을 사용, case [컬럼명] when [value1] then [value2]
else               [value3]
  end
 -- 의 형태
 -- mod함수에서 리턴된 값이, 0일때 '짝수', 아니면 '홀수'
 -- case함수 종료, column alias부여함

    select empno, mod(empno, 2), case when mod(empno, 2) = 0 then '짝수'                           --> searched case 표현식
                                      else                        '홀수'
                                 end as ret
    from emp;

 # 문제 : 월급에 따라 다르게 표현하기

    sal < 2000 이면,                  Low  출력
    sal >= 2000 and sal < 4000 이면,  Mid  출력
    sal >= 4000 이면,                 High 출력

    select empno, ename, sal, decode(trunc(sal/2000), 0, 'Low', 1, 'Mid', 'High') as gubun
    from emp
    order by sal;

    select empno, ename, sal, case trunc(sal/2000) when 0 then 'Low'
                                                   when 1 then 'Mid'
                                                   else        'High'
                              end as gubun
    from emp
    order by sal;

 -- sal/2000의 소수점을 버린 값이 0이면 'Low',
 -- 1이면 'Mid', 0도 1도 아니면 'High'를 출력
 -- 2000으로 나눈 나머지가 0이면 2000보다 작다는 의미
 -- 2000으로 나눈 나머지가 1이면 2000보다 크다는 의미
 -- 2000으로 나눈 나머지가 2이상 4000보다 크다는 의미
 -- 즉 "작다", "중간이다", "크다" 의 의미로 사용되었다.

    select empno, ename, sal, case when sal < 2000                 then 'Low'
                                   when sal >= 2000 and sal < 4000 then 'Mid'
                                   when sal >= 4000                then 'High'
                              end as gubun
    from emp
    order by sal;
 --위의 trunck(sal/2000)을 이용한 것과 결과가 같음

댓글 없음:

댓글 쓰기