나의 개발일지

[SQL] 조건 표현식 본문

Oracle SQL

[SQL] 조건 표현식

YoonJuHan 2023. 4. 14. 15:14

오라클의 조건 처리 구현 방식

  1. 오라클의 SQL 문 안에서 조건 처리 구현 (IF-THEN-ELSE 논리)
  2. DECODE 함수
    1. DECODE는 오라클 8i 이전 버전에서 사용하던 전용 구문
  3. CASE 표현식
    1. ANSI SQL

 

DECODE 함수

  1. 프로그래밍의 IF-THEN-ELSE 구문과 비슷한 기능을 하는 SQL 함수
  2. 첫 번째 인수에 해당하는 표현식을 각 search 값과 비교한 후 표현식이 search 값과 동일하면 해당 result 값을 반환
  3. 기본값(default)은 모든 조건에 맞지 않는 데이터에 적용
  4. 기본값이 생략되면 모든 search 값을 만족하지 않는 데이터는 NULL 값을 반환
  5. 구문
DECODE(col|표현식, search1, result1
		[, search2, result2,..]
                [, default])

 

  • POSITION이 사원이면 5% 인상된 급여, 대리이면 7% 인상, 과장이면 10% 인상된 급여를 반환, 그 외의 직급에 대해서는 인상되지 않은 급여를 반환
SELECT emp_name, position, salary,
        DECODE(position, '사원', salary*1.05,
                         '대리', salary*1.07,
                         '과장', salary*1.1,
                                salary) AS "인상된 급여"
FROM y_emp;

 

  • 급여 등급을 반환, 300 미만은 C, 300 이상 600 미만은 B, 600 이상은 A
SELECT emp_id, emp_name, salary,
       DECODE(TRUNC(salary/300), 0, 'C',
                                 1, 'B',
                                    'A') AS 급여등급
FROM y_emp;

 

 

CASE 표현식

  1. CASE로 시작하고 END로 종료
  2. WHEN ... THEN 절의 표현식과 조건이 일치할 경우 결과 반환
  3. WHEN ... TNEN 쌍은 여러 번 지정 가능
  4. WHEN 절의 조건에 없고 ELSE 절이 존재하는 경우, ELSE 절의 지정값 반환하고 ELSE 절이 없으면 조건에 일치하지 않는 데이터는 NULL을 반환
  5. 구문
CASE 표현식 WHEN 비교 표현식1 THEN 결과1
		  [WHEN 비교 표현식2 THEN 결과2
           WHEN 비교 표현식n THEN 결과n
           ELSE 결과]
END

 

  • DECODE 함수에서 했던 급여 인상 예제를 CASE 표현식으로 표현
SELECT emp_name, position, salary,
       CASE position WHEN '사원' THEN 1.05*salary
                     WHEN '대리' THEN 1.07*salary
                     WHEN '과장' THEN 1.10*salary
                     ELSE salary END AS "인상된 급여"
FROM y_emp;

 

  • 급여의 등급을 반환하는 예제를 CASE 표현식으로 표현
SELECT emp_id, emp_name, salary,
       CASE WHEN salary < 300 THEN 'C'
            WHEN salary >= 300 AND salary < 600 THEN 'B'
            ELSE 'A'
       END AS 급여등급
FROM y_emp;

 

  • CASE 표현식을 파이썬 if-else 문과 비교해 보기
  • CASE 표현식이 익숙하지 않으면 다른 프로그래밍 언어의 조건문과 비교해서 이해하면 좋을 것 같다.
if salary < 300:
    급여등급 = 'C'
elif salary >= 300 and salary < 600:
    급여등급 = 'B'
else:
    급여등급 = 'A'

'Oracle SQL' 카테고리의 다른 글

[SQL] GROUP BY, 그룹 결과 정렬, HAVING 절  (0) 2023.04.16
[SQL] 그룹 함수  (0) 2023.04.16
[SQL] 일반 함수  (0) 2023.04.14
[SQL] 함수의 중첩  (0) 2023.04.14
[SQL] 데이터 유형 변환 함수 (단일 행 함수 4)  (1) 2023.04.09
Comments