SQLite | データの検索 | CASE式で条件に応じた値を返す

CASE式は条件やカラム値に応じて異なる値を返します。ここでは2つの形式を説明します。

CASE式で条件分岐する

主な形式は2つあります。最初の形式は条件を評価し、最初に真となった結果を返します。

SELECT
  CASE
    WHEN 条件1 THEN 結果1
    WHEN 条件2 THEN 結果2
    ELSE 結果3
  END
FROM テーブル名;

条件1が真なら結果1、そうでなく条件2が真なら結果2、すべて偽ならELSEの結果を返します。

例として次のテーブルを作成します。

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

テーブルにデータを追加します。

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> 

resultに応じて3種類の値を返し、結果カラムを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式で値を比較する

2つ目の形式は式を複数の値と順番に比較します。

SELECT
  CASE 式
    WHEN 値1 THEN 結果1
    WHEN 値2 THEN 結果2
    ELSE 結果3
  END
FROM テーブル名;

値1なら結果1、値2なら結果2、どれにも一致しなければELSEの結果を返します。

条件1が真なら結果1、そうでなく条件2が真なら結果2、すべて偽ならELSEの結果を返します。

例として次のテーブルを作成します。

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

テーブルにデータを追加します。

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> 

addressに応じた結果を返し、結果カラムを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> 

条件に応じた値が返されました。