SQLにおける分岐とは、通常のプログラミングとは少し異なり、単なる演算子や関数である。
条件によって結果となる式や値を切り替える文法である。
次の2つの文法がある。
条件による分岐
CASE WHEN 条件式 THEN 結果 WHEN 条件式 THEN 結果 ... ELSE 結果 END
上から条件式を判定し、成立したWHENの結果を採用する。
どのWHENも成立しなければ、ELSEの結果を採用する。
どのWHENも成立せず、ELSEの記述もなければ、NULLとなる。
・次のSQLをファイルとして作成し実行。(case081.sql)
oddtbs=> \i case081.sql
name | score | rank
------------+-------+------
大石友美 | 63 | B
中村優作 | 48 | C
北川陽子 | 94 | A
望月慎太郎 | 53 | C
木村葉子 | 75 | B
藤田智子 | 68 | B
石川大地 | 74 | B
中根貴史 | 53 | C
片山千春 | 66 | B
服部圭祐 | 81 | A
(10 rows)
値による分岐
CASE 式 WHEN 値 THEN 結果 WHEN 値 THEN 結果 ... ELSE 結果 END
上の値から式と比較し、等しいWHENの結果を採用する。
どのWHENも等しくなければ、ELSEの結果を採用する。
どのWHENも等しくなく、ELSEの記述もなければ、NULLとなる。
次のSQLをファイルとして作成し実行。(case082.sql)
oddtbs=> \i case082.sql
name | score | rank
------------+-------+------
大石友美 | 63 | B
中村優作 | 48 | C
北川陽子 | 94 | A
望月慎太郎 | 53 | C
木村葉子 | 75 | B
藤田智子 | 68 | B
石川大地 | 74 | B
中根貴史 | 53 | C
片山千春 | 66 | B
服部圭祐 | 81 | A
(10 rows)
COALESCE(引数, 引数, ...)
左の引数から検査し、最初に見つかったNULLでない引数を結果として採用する。
引数が全てNULLの場合、結果もNULLとなる。
基本的な使用方法
oddtbs=> \t Showing only tuples. oddtbs=> select coalesce(10, 20, null); 10 oddtbs=> select coalesce(null, 20, 30); 20 oddtbs=> select coalesce(null, null, 30); 30 oddtbs=> \t Tuples only is off.
準備
次のSQLをファイルとして作成し実行。(setup081.sql)
oddtbs=> \i setup081.sql ... oddtbs=> select * from t1; salary | append --------+-------- 360000 | 280000 | 0.05 410000 | 0.03 300000 | 480000 | 0.02 (5 rows)
問題点の確認
上記t1テーブルのsalaryは基本給、appendはボーナス加点率とする。
加点のない社員はNULLとなっている。
社員の受け取る総額は、salary + salary * appendで計算できそうだがうまくいかない。
oddtbs=> select *, salary + salary * append as total from t1;
salary | append | total
--------+--------+--------
360000 | |
280000 | 0.05 | 294000
410000 | 0.03 | 422300
300000 | |
480000 | 0.02 | 489600
(5 rows)
※ NULLを含む計算の結果は全てNULLになる。
COALESCEの使用例
このような場合はNULLを0として扱う必要があるり、COALESCEが便利である。
oddtbs=> select *, salary + salary * coalesce(append, 0) as total from t1;
salary | append | total
--------+--------+--------
360000 | | 360000
280000 | 0.05 | 294000
410000 | 0.03 | 422300
300000 | | 300000
480000 | 0.02 | 489600
(5 rows)
CASEの使用例
同じことをCASEで実現する。
次のSQLをファイルとして作成し実行。(case083.sql)
oddtbs=> \i case083.sql
結果は上と同じ。
NULLIF(引数, 引数)
2つの引数を比較し、一致すればNULL、しなければ最初の引数を返す。
基本的な使用方法
oddtbs=> select nullif(10, 10); nullif -------- (1 row) oddtbs=> select nullif(10, 20); nullif -------- 10 (1 row)
準備
次のSQLをファイルとして作成し実行。(setup082.sql)
oddtbs=> \i setup082.sql ... oddtbs=> select * from t2; salary | append --------+-------- 360000 | 0 280000 | 0.05 410000 | 0.03 300000 | 0 480000 | 0.02 (5 rows)
NULLIFの使用例
上記t2は加点がない場合も0がはいっているので計算には困らない。
これを表示の観点から、加点がなければNULLとして何も表示しないしないようにする。
oddtbs=> select salary, nullif(append, 0) as append2 from t1;
salary | append2
--------+---------
360000 |
280000 | 0.05
410000 | 0.03
300000 |
480000 | 0.02
(5 rows)
CASEの使用例
同じことをCASEで実現する。
次のSQLをファイルとして作成し実行。(case084.sql)
oddtbs=> \i case084.sql
salary | append2
--------+---------
360000 |
280000 | 0.05
410000 | 0.03
300000 |
480000 | 0.02
(5 rows)