case()

case() 関数は条件と値のペアを順番に評価し、最初に真となる条件に対応する値を返します。どの条件も真でない場合、任意で指定したデフォルト値を返します。

構文

case(COND1, VAL1[, COND2, VAL2, ...[, DEFAULT]])

パラメーター

COND1, COND2, ...
順番に評価する条件式です。真と判定される条件の基準は系列によって異なります。5.0系(5.0.2605.2まで)ではブーリアンのtrueまたはnull以外の値はすべて真と判定され、nullとブーリアンのfalseのみが偽と判定されます。4.0.2609.0以降では、null、ブーリアンのfalse、数値の0やNaN、空文字列、空のリスト・配列・マップはすべて偽と判定され、それ以外の値は真と判定されます。また、少なくとも1つの条件-値(COND、VAL)ペアを指定する必要があり、指定しない場合はパースエラーが発生します(エラーコードを参照)。
VAL1, VAL2, ...
各条件が真と判定されたときに返す値の式です。対応する条件とペアになります。
DEFAULT
(任意)すべての条件が偽と判定されたときに返すデフォルト値です。引数の総数が奇数の場合、最後の引数がデフォルト値として使用されます。

説明

case() 関数はCOND1、COND2の順に条件を評価して真偽を判定します。条件が真と判定されると、対応する値を即座に返します。以降の条件は評価しません。

どの条件も真にならなかった場合、デフォルト値(DEFAULT)が指定されていればデフォルト値を返し、デフォルト値がなければnullを返します。

条件が偽と判定されると次の条件に進みます。

返却型は実際に評価された値の式の型によって決まります。値の式の型が異なる場合は自動的に上位型に昇格されます(例: 整数と浮動小数点が混在する場合は浮動小数点として返される)。

エラーコード

エラーコード説明
99000条件-値ペアを1つも指定せずに呼び出した場合(例: case()単独呼び出し、デフォルト値のみ指定した呼び出し)。4.0.2609.0以降で発生します。5.0系(5.0.2605.2まで)ではパース時にこの引数の個数を検証しません。

使用例

これらの使用例で参照するWEB_APACHE_SAMPLEテーブルを準備するには、クエリ実習用データを参照してください。

  1. HTTPステータスコードの範囲によるラベル分類

    table limit=5 WEB_APACHE_SAMPLE
    | eval label = case(status >= 500, "サーバーエラー", status >= 400, "クライアントエラー", status >= 300, "リダイレクト", "正常")
    | fields status, label
    | # status の値に応じて label が決まります。
    
  2. HTTPメソッドによる分類

    table limit=5 WEB_APACHE_SAMPLE
    | eval type = case(method == "GET", "照会", method == "POST", "送信", method == "OPTIONS", "事前確認", "その他")
    | fields method, type
    
  3. どの条件も真でなく、デフォルト値もない場合

    json "{'val': 0}" | eval result = case(val == 1, "一", val == 2, "二")
    | # result: null
    
  4. null入力 — 条件評価時にnullは偽として処理され、デフォルト値が返る

    json "{'val': null}" | eval result = case(val == 1, "一", "デフォルト値")
    | # result: デフォルト値
    
  5. 数値の0を条件として使用 — 結果は系列によって異なります

    json "{'val': 0}" | eval result = case(val, "真", "偽")
    | # 5.0系(5.0.2605.2まで)の結果: 真 / 4.0系(4.0.2609.0以降)の結果: 偽
    

    数値の0が真偽どちらと判定されるかは系列によって異なります。5.0系(5.0.2605.2まで)では0を含むnull以外の値はすべて真と判定されるため、この例では「真」が返されます。4.0.2609.0以降では数値の0が偽と判定されるため、代わりにデフォルト値(「偽」)が返されます。

  6. 条件-値ペアを指定せずに呼び出す — 4.0系(4.0.2609.0以降)ではパースエラー

    json "{}" | eval result = case()
    

    4.0.2609.0以降では、条件-値ペアを1つも指定していないため、クエリ実行前にパースエラー(エラーコード99000)が発生します。5.0系(5.0.2605.2まで)ではパース時に引数の個数を検証しないため、case()を引数なしで呼び出してもエラーにならず単にnullを返します。4.0.2609.0より前の4.0系でも同様にパースは通過していましたが、その後の実行段階では経路によって結果が異なりました — ベクトル化実行経路ではエラー(NullPointerException)でクエリが失敗し、行単位実行経路ではエラーなくnullを返していました。

変更履歴

対象導入リリース
case() 関数Sonar 4.0以前
条件判定基準の統一 — 数値0・空文字列などを偽と判定4.0.2609.0
条件-値ペア不足時のパースエラー(99000)4.0.2609.0