分岐

SQLにおける分岐とは、通常のプログラミングとは少し異なり、単なる演算子や関数である。
条件によって結果となる式や値を切り替える文法である。

CASE

次の2つの文法がある。

  1. 条件による分岐

    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)
    
  2. 値による分岐

    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

COALESCE(引数, 引数, ...)

左の引数から検査し、最初に見つかったNULLでない引数を結果として採用する。
引数が全てNULLの場合、結果もNULLとなる。

  1. 基本的な使用方法

    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.
    
  2. 準備

    次の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)
    
  3. 問題点の確認

    上記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になる。
    
  4. 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)
    
  5. CASEの使用例

    同じことをCASEで実現する。

    次のSQLをファイルとして作成し実行。(case083.sql)

    
    
    oddtbs=> \i case083.sql
    結果は上と同じ。
    

NULLIF

NULLIF(引数, 引数)

2つの引数を比較し、一致すればNULL、しなければ最初の引数を返す。

  1. 基本的な使用方法

    oddtbs=> select nullif(10, 10);
     nullif
    --------
    
    (1 row)
    oddtbs=> select nullif(10, 20);
     nullif
    --------
         10
    (1 row)
    
  2. 準備

    次の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)
    
  3. 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)
    
  4. CASEの使用例

    同じことをCASEで実現する。

    次のSQLをファイルとして作成し実行。(case084.sql)

    
    
    oddtbs=> \i case084.sql
     salary | append2
    --------+---------
     360000 |
     280000 |    0.05
     410000 |    0.03
     300000 |
     480000 |    0.02
    (5 rows)