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式」とも呼んでいます。
用途としては、たいてい物理名で挿入されているデータを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で提出しました。はい。