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% 인상하고 나머지는 그냥 월급이 나오게 해서, 이름, 직업, 월급, 인상된 월급을 출력하려면.
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 함수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 > 공부' 카테고리의 다른 글