본문 바로가기
Database/Oracle

[Oracle SQL] SQL 함수 - 단일행 함수 (5) 조건 함수

by Amy IT 2022. 5. 11.

오라클에는 자바에서 사용하는 if문, case문과 같이, 조건에 따라 SQL문을 다르게 처리할 수 있는 DECODE 함수와 CASE 함수가 있습니다. DECODE 함수는 조건이 반드시 일치하는 경우에 사용하는 함수이며, CASE 함수는 조건이 반드시 일치하지 않아도 범위 비교가 가능한 경우에 사용하는 함수입니다. 

 

 

1. DECODE 함수

 

조건이 반드시 일치해야 하는 경우에 사용합니다. 따라서 동등 연산자(=)에 대해서만 사용될 수 있습니다.

DECODE(컬럼, 비교값1, 결과값1,
            비교값2, 결과값2,
            ...
            비교값n, 결과값n,
            기본결과값)

 

다음은 월급이 3000이면 30%를, 월급이 5000이면 20%를 보너스로 지급하고, 나머지 사원은 100%를 지급하는 SQL문입니다. 

SELECT ename,sal,
    DECODE(sal, 3000, sal*0.3, 
                5000, sal*0.2, 
                sal) "보너스"
FROM emp ORDER BY 2 DESC;

월급을 첫 번째로 3000과 비교해서 일치하는 경우 월급에 0.3을 곱하고, 일치하지 않는 경우 두 번째로 5000과 비교해서 일치하면 월급에 0.2를 곱하고, 이 두 가지 모두에 해당이 되지 않으면 기본 결과값인 월급을 그대로 출력하는 것입니다.

 

 

 

2. CASE 함수

 

 조건이 반드시 일치하지 않아도 범위 비교가 가능한 경우에 사용할 수 있으며, 다양한 비교 연산자로 조건을 설정할 수 있습니다. 다음은 조건이 일치하는 경우에 사용되는 기본 문법입니다. 

CASE 컬럼 WHEN 비교값1 THEN 결과값1
         WHEN 비교값2 THEN 결과값2
         ELSE 결과값n
END

 

다음은 앞서 DECODE 함수를 통해 만들었던 SQL문과 동일한 결과값을 출력하는 SQL문입니다. 월급이 3000일 경우 0.3을 곱하고, 5000일 경우 0.2를 곱하며, 그 외는 월급을 그대로 출력하는 것입니다.

SELECT ename, sal, CASE sal WHEN 3000 THEN sal*0.3
                            WHEN 5000 THEN sal*0.2
                            ELSE sal
			END "보너스"
FROM emp ORDER BY 2 DESC;

 

다음은 조건이 반드시 일치하지 않는 경우에 사용되는 기본 문법입니다. 차이점은, CASE 뒤에 컬럼이 지정되지 않고 WHEN 뒤의 조건식에서 지정된다는 점입니다. 조건식에서 비교 연산자(=, >, >=, <, <=, !=), BETWEEN, IN 연산자, 논리 연산자(AND, OR, NOT) 등을 사용할 수 있습니다.

CASE WHEN 조건1 THEN 결과값1
     WHEN 조건2 THEN 결과값2
     ELSE 결과값n
END

 

월급이 2000 이상인 경우 1000을, 1500 이상인 경우 2000을, 1000 이상인 경우 3000을, 그 외인 경우 4000을 출력하는 SQL문입니다. 

SELECT ename, sal, CASE WHEN sal>=2000 THEN 1000
                        WHEN sal>=1500 THEN 2000
                        WHEN sal>=1000 THEN 3000
                        ELSE 4000
                    END "보너스"
FROM emp ORDER BY 2 DESC;

 

다음과 같이 BETWEEN 연산자를 사용한 범위 조건도 가능합니다.

SELECT ename,sal,
    CASE WHEN sal BETWEEN 2001 AND 5000 THEN '상'
         WHEN sal BETWEEN 1001 AND 2000 THEN '중'
         ELSE '하'
    END "등급"
FROM emp
ORDER BY 2 DESC;

 

IN 연산자를 사용한 조건도 가능합니다.

SELECT ename,sal,
    CASE WHEN sal IN(5000,3000) THEN '상'
         WHEN sal IN(2850,2450) THEN '중'
         ELSE '하'
    END "등급"
FROM emp
ORDER BY 2 DESC;

 

 

이상으로 단일행 함수에 대한 기본 내용 정리를 마칩니다. 다음 글에서는 다중행 함수(그룹 함수)에 대한 내용이 시작됩니다.

 

 

댓글