実施環境: Splunk Free 8.2.2
0. 概要
Splunk では対象のフィールドに値が入っていない場合、 NULL として扱われます。
この NULL は、空文字列や 0 とは明確に別のものです。
今回は判定処理においてこの NULL を処理した場合の挙動について紹介していきます。
1. 使用するデータ
今回は、以下のデータをもとに確認していきます。
Splunk
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT),
EMPTY = if( CNT == 2, "", CNT),
ZERO = if( CNT == 3, 0, CNT)
| fields - CNT, _time
EMPTY | NULL | ZERO |
---|---|---|
1 | (NULL) | 1 |
(空文字列) | 2 | 2 |
3 | 3 | 0 |
2. 通常の比較
比較演算子を用いた通常の比較において、両辺のどちらか一方でも NULL 値の場合は、常にその条件式は「偽」となります。
下記の条件式も、同一の値について等しいかどうかの確認なので NULL 値も当然「真」となるように思いますが、 NULL 値の場合のみ「偽」となっています。
Splunk
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT),
EMPTY = if( CNT == 2, "", CNT),
ZERO = if( CNT == 3, 0, CNT)
| fields - CNT, _time
| eval NULL_IF = if( NULL == NULL, "OK", "NG"),
EMPTY_IF = if( EMPTY == EMPTY, "OK", "NG"),
ZERO_IF = if( ZERO == ZERO, "OK", "NG")
3. NOT を使用する比較
NOT 演算子は条件の真偽を反転させる演算子ですが、その処理において NULL 値が関与しているかどうかは判定しません。
そのため下記のように同一の値について異なるかどうかを判定してその結果を反転させる場合、結果は NULL 値も含めて「真」となります。
Splunk
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT),
EMPTY = if( CNT == 2, "", CNT),
ZERO = if( CNT == 3, 0, CNT)
| fields - CNT, _time
| eval NULL_IF = if( NOT NULL != NULL, "OK", "NG"),
EMPTY_IF = if( NOT EMPTY != EMPTY, "OK", "NG"),
ZERO_IF = if( NOT ZERO != ZERO, "OK", "NG")
A | A == A | A != A | NOT A != A |
---|---|---|---|
NULL | 偽 | 偽 | 真 |
その他 | 真 | 偽 | 真 |
4. 評価関数 を使用する比較
where コマンドや eval コマンドといった評価関数を使用する比較の場合、 NULL 値について判定を行える関数があります。
それが NULL 値の場合に真となる isnull 関数と、 NULL 値の場合に偽となる isnotnull 関数です。
Splunk
| makeresults count=3
| streamstats count AS CNT
| eval NULL = if( CNT == 1, null(), CNT),
EMPTY = if( CNT == 2, "", CNT),
ZERO = if( CNT == 3, 0, CNT)
| fields - CNT, _time
| eval NULL_IF = if( isnull(NULL), "OK", "NG"),
EMPTY_IF = if( isnull(EMPTY), "OK", "NG"),
ZERO_IF = if( isnull(ZERO), "OK", "NG")