본문 바로가기
데이터베이스/SQLite

SQLite에서 오라클의 DECODE 사용하기(CASE WHEN...)

by Dokon Jang 2021. 2. 19.
반응형

오라클의 DECODE 함수는 정말 막강한 기능을 제공하고 있습니다.
DECODE를 사용하여 간결한 SQL을 만들기도 하는데 SQLite에는 DECODE 함수가 없습니다.
DECODE는 SQL 표준이 아닌 오라클의 기능으로 생각해야 할 듯하네요.

[CASE 문법1]

CASE case_expression
     WHEN when_expression_1 THEN result_1
     WHEN when_expression_2 THEN result_2
     ...
     [ ELSE result_else ] 
END

[예제 쿼리1]

SELECT NAME, YYYY||MM||DD,
       CASE IS_CHECK 
	   WHEN 'Y' THEN '체크됨'
	   WHEN 'N' THEN '체크안됨'
	   ELSE '값없음'
	   END
  FROM HISTORY

 

[CASE 문법2] 

CASE
     WHEN bool_expression_1 THEN result_1
     WHEN bool_expression_2 THEN result_2
     [ ELSE result_else ] 
END

[예제 쿼리2]

SELECT NAME, YYYY||MM||DD,
       CASE  
	   WHEN IS_CHECK = 'Y' THEN '체크됨'
	   WHEN IS_CHECK = 'N' THEN '체크안됨'
	   ELSE '값없음'
	   END
  FROM HISTORY

현재 작업중이 안드로이드 프로젝트에 사용한 예입니다.

체크리스트 안드로이드 앱을 개발하고 있고, 집계 관련해서 SQLite의 CASE문을 사용했습니다.
일주일동안의 체크리스트 현황을 보여주는 쿼리를 작성하고 화면을 구성했습니다.
 
[쿼리]

SELECT NAME, MAX(SORT) SORT, 
       MAX(CASE YYYY || MM || DD WHEN '20210213' THEN IS_CHECK ELSE 'N' END) AS A,
       MAX(CASE YYYY || MM || DD WHEN '20210214' THEN IS_CHECK ELSE 'N' END) AS B,
       MAX(CASE YYYY || MM || DD WHEN '20210215' THEN IS_CHECK ELSE 'N' END) AS C,
       MAX(CASE YYYY || MM || DD WHEN '20210216' THEN IS_CHECK ELSE 'N' END) AS D,
       MAX(CASE YYYY || MM || DD WHEN '20210217' THEN IS_CHECK ELSE 'N' END) AS E,
       MAX(CASE YYYY || MM || DD WHEN '20210218' THEN IS_CHECK ELSE 'N' END) AS F,
       MAX(CASE YYYY || MM || DD WHEN '20210219' THEN IS_CHECK ELSE 'N' END) AS G
  FROM HISTORY
 WHERE MAIN_ID = 1
   AND YYYY BETWEEN '2021' AND '2021'
   AND WW = '00'
   AND YYYY || MM || DD BETWEEN '20210213' AND '20210219'
 GROUP BY NAME 
 ORDER BY SORT, NAME

[쿼리 결과]

[안드로이드 화면]

반응형

댓글