case()
case() 関数は条件と値のペアを順番に評価し、最初に真となる条件に対応する値を返します。どの条件も真でない場合、任意で指定したデフォルト値を返します。
構文
パラメーター
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テーブルを準備するには、クエリ実習用データを参照してください。
-
HTTPステータスコードの範囲によるラベル分類
table limit=5 WEB_APACHE_SAMPLE | eval label = case(status >= 500, "サーバーエラー", status >= 400, "クライアントエラー", status >= 300, "リダイレクト", "正常") | fields status, label | # status の値に応じて label が決まります。 -
HTTPメソッドによる分類
table limit=5 WEB_APACHE_SAMPLE | eval type = case(method == "GET", "照会", method == "POST", "送信", method == "OPTIONS", "事前確認", "その他") | fields method, type -
どの条件も真でなく、デフォルト値もない場合
json "{'val': 0}" | eval result = case(val == 1, "一", val == 2, "二") | # result: null -
null入力 — 条件評価時にnullは偽として処理され、デフォルト値が返るjson "{'val': null}" | eval result = case(val == 1, "一", "デフォルト値") | # result: デフォルト値 -
数値の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が偽と判定されるため、代わりにデフォルト値(「偽」)が返されます。 -
条件-値ペアを指定せずに呼び出す — 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 |