Link Search Menu Expand Document

SQL Single General Function

Table of contents

  1. Null Functions
    1. nvl() / nvl2()
    2. nullif()
    3. coalesce()
  2. Condition functions
    1. decode()
    2. case
  3. Example

Null Functions

nvl() / nvl2()

테이블의 널값을 대체하는 함수

▸ 컬럼명과 exprN은 반드시 데이터 타입이 일치해야 함

syntax

nvl(컬럼명, expr1)** : **null을 0 또는 다른 값으로 변환

nvl2(컬럼명, expr1, expr2)** : **컬럼명을 검사해 결과가 null이면 expr2반환, null이 아니면 expr3을 반환

▸ exprN에는 날짜, 문자, 숫자형이 들어갈 수 있음

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

nullif()

두 표현식을 비교하여 동일한 경우에는 NULL을 반환, 동일하지 않으면 첫 번째 표현식을 반환

syntax

nullif(expr1, expr2)

select nullif('A','A'), nullif('A','B')
from dual;

![](

coalesce()

인수 중 null이 아닌 첫 번째 인수를 반환하는 함수

syntax

coalesce(expr1, expr2, … , exprN)

select ename, sal, comm, coalesce(comm, sal, 0)
from emp
order by job;


Condition functions

decode()

조건에 따라 다른 결과를 얻고 싶을 때 사용

▸ if else문과 같은 기능, sql문안에서 사용할 수 있도록 한 오라클고유함수

▸ 기본 결과가 명시되지 않았을 경우에는 NULL값을 반환

▸ nesting 가능

syntax

decode(표현식,

조건1, 결과1,

조건2, 결과2,

기본결과n) as alias

select deptno
     , name
     , decode(deptno, 101, '컴공'
                    , 102, '미디어 융합'
                    , 103, '소프트공학'
                    , '기타학과')
	from professor;

case

프로그램 언어의 if else와 같이 사용할 수 있음

expr이 조건 1과 일치하면 1반환… 값이 없거나 null일 경우에는 else 다음 기술한 결과n을 반환함

▸ decode대신 일반적으로 사용되는 문장(ISO 표준 규격에 더 잘맞음)

syntax

case expr

when 조건1 then 결과1

when 조건2 then 결과2

else 결과n

end [as 별칭]


Example

Q1. student에서 전공이 101인 학생들중에 jumin 성별구분해서 1=남자 2=여자를 출력

name, jumin, gender

select name
, substr(jumin,7,1)
, decode(substr(jumin,7,1), 1, '남자', '여자') gender
	from student;

Q2. Student 테이블에서 1 전공이 (deptno1) 101번인 학생의 이름과 연락처와 지역을 출력

단,지역번호가 02 는 “SEOUL” , 031 은 “GYEONGGI”, 051 은 “BUSAN”, 052 는 “ULSAN”, 055 는 “GYEONGNAM”

select name
		 , tel
		 , substr(tel,0, instr(tel,')')-1)
     , decode(substr(tel,0, instr(tel,')')-1), 02, 'SEOUL'
                                            , 031, 'GYEONGGI'
                                            , 051, 'BUSAN'
                                            , 052, 'ULSAN'
                                            , 053, 'DAGUE'
                                            , 055, 'GYEONGNAM') decode
		 , case substr(tel,0, instr(tel,')')-1) -- ISO  표준 규격에 더 맞음
            When '02' then 'SEOUL'
            When '051' then 'GYEONGGI'
            When '052' then 'ULSAN'
            When '053' then 'DAGUE'
            When '055' then 'GYEONGNAM'
			 end as 지역번호
	from student 
 where deptno1 = 101;

Q3. when 조건 between 값1 and 값2 then 출력

emp에서 sal 1~1000 1등급, 1001~2000 2등급, 2001~3000 2등급, 3001~4000 2등급, 4001보다 크면 5등급

 select ename
      , sal
      , case when sal between    1 and 1000 then '1등급'
             when sal between 1001 and 1000 then '2등급'
             when sal between 2001 and 3000 then '3등급'
             when sal between 3001 and 4000 then '4등급'
             when sal > 4001 then '5등급'
       end as 등급 
	 from emp
  order by sal desc;

Q4. student에서 jumin에 월참조해서 해당월의 분기를 출력(1Q, 2Q, 3Q, 4Q)

name, jumin, 분기

select name
    , jumin
    , substr(jumin,3,2) month
    , case when substr(jumin,3,2) between 1 and 3 then '1Q'
             when substr(jumin,3,2) between 4 and 6 then '2Q'
             when substr(jumin,3,2) between 7 and 9 then '3Q'
             when substr(jumin,3,2) >= 10 then '4Q'
      end as 분기
	 from student;

Q5. emp에서 10=회계부, 20=연구실, 30=영업부, 40=전산실

deptno, 부서명

-- 1) decode
-- 2) case
select deptno
     , decode(deptno, 10, '회계부'
                      , 20, '연구실'
                      , 30, '영업부'
                      , 40, '전산실') 부서명
     , case deptno When 10 then '회계부'
                     When 20 then '연구실'
                     When 30 then '영업부'
                     When 40 then '전산실'
      end as 부서명
  from emp;

Q6. 급여인상율을 다르게 적용하기

emp에서 sal < 1000 0.8%인상, 1000~2000 0.5%, 2001~3000 0.3% 그 이상은 0.1% 인상분 출력

ename, sal(인상전급여), 인상후급여

-- 1) decode
-- 2) case 
select * from emp;
select ename, sal
     , decode(sign(sal-1000), -1, sal*1.08,
                               0, sal*1.05,
                               1, decode(sign(sal-2000), -1, sal*1.05,0, sal*1.05, 1, decode(sign(sal-3000),-1, sal*1.03, 0, sal*1.03, 1, sal*1.01)))
		 , case when sal < 1000  then sal*1.08
						when sal between 1000 and 2000 then sal*1.05
						when sal between 2001 and 3000 then sal*1.03
						when sal > 3000 then sal*1.01
				end as 인상후급여
  from emp; 


이 웹사이트는 jekyll로 제작되었습니다. Patrick Marsceill, Distributed by an MIT license.