─━ IT ━─

[Oracle] SQL의 IF "CASE ~ WHEN 식"

DKel 2021. 2. 5. 18:03
반응형

 

검색 Case 표현식을 통한 예제

SQL 내에서의 IF이라고도 할 수있는 CASE 표현식은

Oracle 9i 이전부터 있는 단순 CASE 표현식,

Oracle 9i 이후에 구현 된 검색 CASE 표현식 등 2 종류가있다.

 

또한 PL / SQL에서도 CASE 문장을 지원하고 있다.

SELECT 목록에 설명 할 수 있는 것은 물론, LIKE 등의 조건식과 CASE 표현식을 병행하여

WHERE 절과 GROUP BY, HAVING 또는 ORDER BY 절에 기술하는 것으로 분류에 의한 다른 수식이나 값으로

업데이트 조건에 의한 추출 과 정렬 등 매우 강력한 SQL을 작성할 수 있다.

 

단순 CASE 표현식 (simple case expression)

 

CASE에 지정된 표현식 expr 수식의 값과 비교할 식의 값 comparison_expr1 를 매칭시켜

해당하는 값을 갖는 위치의 반환 값 ret_expr1 을 리턴하는 표현식이다. (Oracle 8i 이전에도 사용할 수있다)

 

 

단순 CASE 표현식은 DECODE 함수를 사용하는 것보다 쉽게 쓸 수있다.

그러나 몇 개 이상을 비교하거나 NULL로 비교를 하는 경우 DECODE 함수 도 많은 인기가 있다.

 

 

 

표현식 expr 의 값을 바탕으로 분기하는 단순 CASE 문은

IF의 나열이나 SELECT 를 동반 DECODE 함수를 사용하는 것보다 보기 쉽고, 더 빠르게 작동한다.

 

CASE 표현식의 형식

 

CASE  expr - 여기에 식 (expr)에서 WHEN도 식
	WHEN comparison_expr1 THEN return_expr1 
	WHEN comparison_expr2 THEN return_expr2
	ELSE return_default_expr
END

 

  • 컬러 코드를 이름으로 변환하는 CASE 표현식의 예

SQL> select 
  2 color_code,            - 컬러 코드 
  3      CASE  color_code
  4 WHEN 'FFF'  THEN 'WHITE'     - FFF이라면 흰색 
  5 WHEN '000'  THEN 'BACK'       - 000이라면 검정 
  6 ELSE color_code - 그 이외라면 코드 값을 리턴
  7 END color_name
  8 from
  9 color_sample;
 
COLOR_CODE COLOR_NAME
---------- ----------
FFF WHITE
000 BACK
F00 F00
0F0 0F0
00F 00F

 

주의

 

단순 CASE 표현식에서 비교 식 comparison_expr 및 반환 return_expr , default_expr 은

NULL 값을 설명 할 수 없다. NULL = NULL의 조건은 NULL이 되기 위해 평가되지 않는다. 

 

 

검색 CASE 표현식 (searched case expression)

 

평가 조건이 각각 다른 것 ( expr1 = expr2 의 형식이되지 않아도)
단순 CASE 표현식과 비교하면 수식 expr 의 유무와 식 comparison_expr1 인지

조건문 condition1 에서 미묘하게 다르다.

 

 

 

검색 CASE 표현식의 형식
CASE  - 여기 expr의 표기가없고 WHEN 조건
	WHEN condition1 THEN return_expr1 
	WHEN condition2 THEN return_expr2
	ELSE retun default_expr
END

그 밖에도 condition1 은 IS NULL 또는 IN, LIKE 등 설명도 가능

 

검색 CASE 표현식을 이용한 가족 구성을 나타낸 예 (CASE 표현식은 단락 평가)

 

SQL> select
  2     age, gender,
  3     CASE
  4       WHEN age <= 15    THEN 'child'      -- 15세 이하
  5       WHEN age <  20    THEN 'young'      -- 20세 이상
  6       WHEN gender = 'F' THEN 'lady'       -- 여자
  7       WHEN gender = 'M' THEN 'gentleman'  -- 남자
  8       ELSE                   'ze'         -- 미상
  9    END status
 10  from
 11     family;
 
       AGE GENDER STATUS
---------- ------ ----------
         1 F      child
        13 M      child
        19 M      young
        38 F      lady
        39 M      gentleman
<NULL>     <NULL> ze

 

PL / SQL 에 CASE 표현식이 사용할 수 Oracle 9i 이상

Oracle 9i 이전 PL / SQL 파서는 SQL 파서와 다르기 때문이다.

따라서 PL / SQL에 직접 포함 된 SQL (임베디드 SQL)에서 일부 SQL 구문이 지원되지 않는다는 것을 알고있다.

Oracle 9i 이후 파서가 통합되어 있기 때문에 일부 기능을 사용할 수 없는 것은 아니라고 생각된다.

반응형