条件式

CASE

標準SQLのCASE式には2つの形式があります。「単純」な形式は、expressionと等しいものが見つかるまで、左から右に各value式を検索します。

CASE expression
    WHEN value THEN result
    [ WHEN ... ]
    [ ELSE result ]
END

一致するvalueresultが返されます。一致が見つからない場合、ELSE句の結果が、存在すれば返され、存在しなければnullが返されます。例

SELECT a,
       CASE a
           WHEN 1 THEN 'one'
           WHEN 2 THEN 'two'
           ELSE 'many'
       END

「検索」形式は、真になるまで左から右に各ブールconditionを評価し、一致するresultを返します。

CASE
    WHEN condition THEN result
    [ WHEN ... ]
    [ ELSE result ]
END

条件がどれも真にならない場合、ELSE句の結果が、存在すれば返され、存在しなければnullが返されます。例

SELECT a, b,
       CASE
           WHEN a = 1 THEN 'aaa'
           WHEN b = 2 THEN 'bbb'
           ELSE 'ccc'
       END

IF

IF関数は、実際には次のCASE式に相当する言語構成です。

CASE
    WHEN condition THEN true_value
    [ ELSE false_value ]
END
if(condition, true_value)

conditionが真の場合、true_valueを評価して返します。それ以外の場合は、nullを返し、true_valueは評価されません。

if(condition, true_value, false_value)

conditionが真の場合、true_valueを評価して返します。それ以外の場合は、false_valueを評価して返します。

COALESCE

coalesce(value1, value2[, ...])

引数リストの最初の非nullのvalueを返します。CASE式と同様に、引数は必要に応じてのみ評価されます。

NULLIF

nullif(value1, value2)

value1value2と等しい場合、nullを返します。それ以外の場合は、value1を返します。

TRY

try(expression)

式を評価し、NULLを返すことで特定の種類のエラーを処理します。

破損したデータや無効なデータが検出された場合に、クエリが失敗するのではなく、NULLやデフォルト値を生成することを優先する場合は、TRY関数が役立ちます。デフォルト値を指定するには、COALESCE関数と組み合わせてTRY関数を使用できます。

TRYによって処理されるエラーは次のとおりです。

  • ゼロ除算

  • 無効なキャスト引数または無効な関数引数

  • 範囲外の数値

いくつかの無効なデータを含むソーステーブル

SELECT * FROM shipping;
 origin_state | origin_zip | packages | total_cost
--------------+------------+----------+------------
 California   |      94131 |       25 |        100
 California   |      P332a |        5 |         72
 California   |      94025 |        0 |        155
 New Jersey   |      08544 |      225 |        490
(4 rows)

TRYを使用しない場合のクエリ失敗

SELECT CAST(origin_zip AS BIGINT) FROM shipping;
Query failed: Can not cast 'P332a' to BIGINT

TRYを使用したNULL値

SELECT TRY(CAST(origin_zip AS BIGINT)) FROM shipping;
 origin_zip
------------
      94131
 NULL
      94025
      08544
(4 rows)

TRYを使用しない場合のクエリ失敗

SELECT total_cost / packages AS per_package FROM shipping;
Query failed: / by zero

TRYCOALESCEを使用したデフォルト値

SELECT COALESCE(TRY(total_cost / packages), 0) AS per_package FROM shipping;
 per_package
-------------
          4
         14
          0
         19
(4 rows)