CASE文とCASE式

SQLの話です。

 

普段、SQLを使うときはJavaなどのプログラムから間接的に使うので、条件分岐などはプログラム側に任せています。

ですので、SQLのCASEを使うことはそんなにありません。

ただ、最近はSQLだけで完結する作業が多いので、何度か使う機会がありました。

 

CASE文とCASE式

SQLのCASEには2つの書き方があります。

CASE column_a
  WHEN '10' THEN 'とお'
  WHEN '20' THEN 'はた'
  WHEN '30' THEN 'みそ'
  ELSE 'もも'
END
CASE
  WHEN column_a = '10' THEN 'A=とお'
  WHEN column_b = '20' THEN 'B=はた'
  WHEN column_c = '30' THEN 'C=みそ'
  ELSE 'もも'
END

前者は1つのカラムを評価し、1つの結果を複数のパターンでアウトプットできます。

後者は複数のカラムを評価し、1つの結果を複数のパターンでアウトプットできます。

こちらのページによりますと、前者を「CASE式」、後者を「CASE文」と呼ぶそうです。

CASE 式 と CASE 文の違い - オラクル・Oracleをマスターするための基本と仕組み

また、同じサイトの別ページでは、前者を「単純CASE式」、後者を「検索CASE式」とも呼んでいます。

CASE 式 - オラクル・Oracle SQL 入門

 

用途としては、たいてい物理名で挿入されているデータをSQLだけでそれっぽく抽出する場合にCASE句で論理名に変換してあげたりしています。

物理名と論理名を紐付けるようなテーブル設計であれば、結合してあげればよいのですが。

 

大きな違いというか特徴として、前者の単純CASE式ではNULL値を評価できません。

単純CASE式

CASE column_a
  WHEN '10' THEN 'とお'
  WHEN '20' THEN 'はた'
  WHEN '30' THEN 'みそ'
  WHEN IS NULL THEN 'ぬる' --←できない ELSE 'もも' END

検索CASE式 (CASE文)

CASE
  WHEN column_a = '10' THEN 'A=とお'
  WHEN column_b = '20' THEN 'B=はた'
  WHEN column_c = '30' THEN 'C=みそ'
  WHEN column_d IS NULL THEN 'D=ぬる' --←できる ELSE 'もも' END

単純CASE式でNULLを評価したい場合

DECODE句を使いましょう。

CASE と DECODE 関数の違い - オラクル・Oracleをマスターするための基本と仕組み

DECODE( column_a
  , '10' , 'とお'
  , '20' , 'はた'
  , '30' , 'みそ'
  , 'もも'
)

1つ目の引数を評価対象とし、以降は2つのセットで前者に該当したら後者を返すという関数です。最後にあぶれた引数はCASEのELSEと同様で、それまでのいずれのセットにも該当しなかった場合です。

DECODE句では、等号(=)による評価しかできませんが、それは単純CASE式でも同様です。等号以外の比較をする場合は検索CASE式を用いることになります。

 

 

 

と、いろいろ書きましたが、実際にはNULLは考慮しなくていいや、というSQLで提出しました。はい。