SQLite | 데이터 조회 | 컬럼의 값에 따라 다른 결과를 반환하는 조건부 표현식 작성 (CASE 절)

CASE 절을 사용하여 열 값에 대해 조건 분기를 수행하여 다른 값을 반환할 수 있다. 여기에서는 CASE 절을 사용한 조건문 작성 방법에 대해 설명한다.

CASE 절을 사용한 조건 분기

CASE 절을 사용한 조건부 표현식 작성 방법은 크게 나누면 두 가지 형식이 있다. 우선 첫번째 형식은 다음과 같다. 조건을 충족하는지 여부를 확인하고 값을 반환한다.

SELECT
  CASE
    WHEN 조건식1 THEN 결과1
    WHEN 조건식2 THEN 결과2
    ELSE 결과3
  END
FROM 테이블명;

조건식1이 참이면 결과1을 반환하고, 조건식 1이 거짓이고 조건식2가 참이면 결과2를 반환하며, 모든 조건식이 거짓이라면 결과3을 반환한다.

그럼 실제로 해보도록 하겠다. 다음과 같이 테이블을 만든다.

create table exam (name text, result integer);
sqlite> create table exam (name text, result integer);
sqlite> 

INSERT 문을 사용하여 테이블에 데이터를 추가한다.

insert into exam values ('devkuma', 85);
insert into exam values ('kimkc', 54);
insert into exam values ('araikuma', 78);
insert into exam values ('happykuma', 98);
insert into exam values ('mykuma', 48);
insert into exam values ('raccoon', 68);
sqlite> insert into exam values ('devkuma', 85);
sqlite> insert into exam values ('kimkc', 54);
sqlite> insert into exam values ('araikuma', 78);
sqlite> insert into exam values ('happykuma', 98);
sqlite> insert into exam values ('mykuma', 48);
sqlite> insert into exam values ('raccoon', 68);
sqlite> 

그러면 CASE 절을 사용하여 result 컬럼의 값에 따라 서로 다른 3개의 데이터를 받아와 보자. 아래에서는 AS 절를 사용하여 CASE 절에서 반환되는 데이터의 컬럼명이 judgment으로 설정한다.

select
  name, result, 
  case
    when result > 80 then 'Pass'
    when result > 60 then 'ReTest'
    else 'Fail'
  end as judgment
from exam;
sqlite> select
   ...>   name, result, 
   ...>   case
   ...>     when result > 80 then 'Pass'
   ...>     when result > 60 then 'ReTest'
   ...>     else 'Fail'
   ...>   end as judgment
   ...> from exam;
name        result      judgment  
----------  ----------  ----------
devkuma     85          Pass      
kimkc       54          Fail      
araikuma    78          ReTest    
happykuma   98          Pass      
mykuma      48          Fail      
raccoon     68          ReTest    
sqlite> 

설정한 조건에 따라 값이 반환되었다.

CASE 절을 사용한 값 목록과 비교

이어 두번째 형식이다. 여러 값과 순차적으로 비교하여 일치하는 결과 값을 반환한다.

SELECT
  CASE 표현식
    WHEN 값1 THEN 결과1
    WHEN 값2 THEN 결과2
    ELSE 결과3
  END
FROM 테이블 명;

값1과 같으면 결과1을 반환하고, 값2와 같으면 결과2를 반환하며, 어느 것에도 일치하지 않으면 결과3을 반환한다.

조건식1이 참이면 결과1을 반환하고, 조건식 1이 거짓이고 조건식2가 참이면 결과2를 반환하며, 모든 조건식이 거짓이라면 결과3을 반환한다.

그럼 실제로 해보도록 하겠다. 다음과 같이 테이블을 만든다.

create table company (name text, address text);
sqlite> create table company (name text, address text);
sqlite> 

INSERT 문을 사용하여 테이블에 데이터를 추가한다.

insert into company values ('A_Electric', 'Seoul');
insert into company values ('B_Motor', 'California');
insert into company values ('C_Mobile', 'Suwon');
insert into company values ('D_Shipping', 'Beijing');
sqlite> insert into company values ('A_Electric', 'Seoul');
sqlite> insert into company values ('B_Motor', 'California');
sqlite> insert into company values ('C_Mobile', 'Suwon');
sqlite> insert into company values ('D_Shipping', 'Beijing');
sqlite> 

그러면 CASE 절을 사용하여 address 컬럼의 값에 따라 서로 다른 데이터를 맞게 받아와 보자. 아래에서 AS 절과 사용하여, CASE 절에서 반환되는 데이터의 컬럼명 Sales으로 설정한다.

select
  name, address, 
  case address
    when 'California' then 'America'
    when 'Seoul' then 'Korea'
    when 'Beijing' then 'China'
    else 'Unknown'
  end as country
from company;
sqlite> select
   ...>   name, address, 
   ...>   case address
   ...>     when 'California' then 'America'
   ...>     when 'Seoul' then 'Korea'
   ...>     when 'Beijing' then 'China'
   ...>     else 'Unknown'
   ...>   end as country
   ...> from company;
name        address     country   
----------  ----------  ----------
A_Electric  Seoul       Korea     
B_Motor     California  America   
C_Mobile    Suwon       Unknown   
D_Shipping  Beijing     China     
sqlite> 

설정한 조건에 따라 값이 반환되었다.