SQL

[SQL] 조건부 표현식 CASE, DECODE(오라클 전용)

bornsoon 2024. 9. 27. 17:55

조건부 표현식에는 CASE 표현식이 있으며, Oracle에는 이와 비슷한 DECODE 표현식이 하나 더 있다.

  • CASE 조건문은 Short-Circuit Evalution으로 조건이 참인 이후의 조건은 따지지 않는다.
  • 반환값들은 같은 데이터 타입이어야 한다.

 

CASE 조건문

--[SIMPLE_CASE_EXPRESSION SQL문]
SELECT last_name, salary, job_id,
       CASE job_id WHEN 'IT_PROG'  THEN 1.10 * salary  --조건 만족하면 끝(Shor-Circuit Evaluation
                   WHEN 'ST_CRERK' THEN 1.15 * salary
                   WHEN 'SA_REP'   THEN 1.20 * salary
                                   ELSE salary    -- ELSE 없으면 NULL값 출력
       END "Revised Salary"   -- 별칭부여
FROM employees;


--[SEARCHED_CASE_EXPRESSION SQL문]
SELECT last_name, salary, job_id,
	   CASE WHEN job_id = 'IT_PROG'  THEN 1.10 * salary
			WHEN job_id = 'ST_CRERK' THEN 1.10 * salary
            WHEN job_id = 'SA_REP'   THEN 1.10 * salary
                                     ELSE salary 
       END "Revised Salary"
FROM employees;


---비동등 조건도 가능
SELECT last_name, salary
     ,(CASE WHEN salary < 5000  THEN 'Low'
            WHEN salary < 10000 THEN 'Medium'
            WHEN salary < 20000 THEN 'Good'
                                ELSE 'Excellent'
       END) qualified_salary
FROM employees;

 

 

DECODE 조건문 (오라클 전용)

  • NULL 값은 원래 비교가 안되지만 DECODE 조건문은 NULL 값과 동등 비교도 허용한다.
SELECT last_name, job_id, salary
     , DECODE(job_id, 'IT_PROG',  1.10 * salary
                    , 'ST_CLERK', 1.15 * salary
                    , 'SA_REP',   1.20 * salary
                                , salary)
"REVISED_SALARY"
FROM employees;

SELECT last_name, job_id, salary
     , DECODE(commission_pct, NULL, '노 커미션'
                            ,  0.1, '10% 커미션'
                            ,  0.2, '20% 커미션'
                                  , '기타 커미션') AS
커미션
FROM employees;

 

DECODE 함수로 내 마음대로 정렬하기

-------------------CASE------------------------------
SELECT *
FROM local_sales
ORDER BY CASE city WHEN '서울' THEN 10
                   WHEN '부산' THEN 20
                   WHEN '대구' THEN 30
                   WHEN '대전' THEN 40
                   WHEN '인천' THEN 50
          END;

-------------------DECODE-------------------------------
SELECT *
FROM local_sales
ORDER BY DECODE(city, '서울', 10
                    , '부산', 20
                    , '대구', 30
                    , '대전', 40
                    , '인천', 50);
728x90

'SQL' 카테고리의 다른 글

[SQL] 서브쿼리의 결과값이 NULL이 될 경우  (0) 2024.09.30
[SQL] 외부 조인 주의해야할 점  (0) 2024.09.30
[SQL] SQL의 NULL  (1) 2024.09.26
[Oracle] 날짜 포맷 형식  (0) 2024.09.26
[SQL] 연산자 우선 순위  (0) 2024.09.26