BigQueryで集計やデータ分析を行う際、「全てのデータが特定の条件を満たしているかどうか」を一度に判定したいシーンはたまにある。
たとえば「全ての注文が出荷済みか」「全社員が研修を完了しているか」などだ。
これらの条件を一括で評価したいときに便利なのが、LOGICAL_AND
関数である。
本記事では、LOGICAL_ANDの意味や使い方、実際の業務で役立つ活用例まで、なるべくわかりやすく解説していく。
目次
LOGICAL_ANDとは?
LOGICAL_ANDは集約関数の一つであり、複数レコードの中で指定した条件や式がすべてTRUEかどうかを判定できる関数 だ。
この関数を使うことで、「全員が条件を満たしているか」や「全てのデータが基準をクリアしているか」ということを一度に調べることができる。
例えば、製品テーブルで「全ての商品が在庫切れでない(在庫数が1以上)」かどうかを判定したい場合、次のようなクエリになる。
1 2 3 4 5 |
SELECT LOGICAL_AND(stock_quantity >= 1) AS all_in_stock FROM products |
このクエリは、全ての商品についてstock_quantity
が1以上であればTRUEを返し、1つでも在庫切れの商品があれば、下記のようにFALSEを返す。
このようにLOGICAL_ANDは、品質管理やフラグ判定、システム監査などさまざまな現場で幅広く活用されている便利な関数だ。
なぜLOGICAL_ANDが必要なのか?
通常、個々の行に対してWHERE
句で条件判定を行うだけでは「全部を満たしているか」の集約的な判定は難しい。
できたとしても、かなり複雑なクエリになることが多い。
一方で、LOGICAL_AND
関数を使うことで、より簡潔かつ効率的に「すべてがTRUEか」を確認できるようになる。
クエリもシンプルになるし、データの異常値をチェックする際にも非常に便利なので、個人的にはよく使っている。
LOGICAL_ANDの基本構文と使い方
基本構文
LOGICAL_AND
は、ブール型(TRUE/FALSE)の値もしくはブール型を返す条件式を引数に取る。
そして、指定したカラムの値、もしくは条件式の結果が全て TRUE であれば TRUE を返し、1つでも FALSE や NULL が含まれていれば FALSE または NULL を返す。
シンプルな使用例
1 2 3 4 5 |
SELECT LOGICAL_AND(status = 'shipped') AS all_shipped FROM orders |
このクエリの結果がTRUEであれば、全ての注文が出荷済み、FALSEであれば未出荷の注文が1件以上あることを意味する。
GROUP BYとの組み合わせ
たとえば、顧客ごとに全ての注文が出荷済みかどうかを判定したい場合、次のようなクエリになる。
1 2 3 4 5 6 7 8 |
SELECT customer_id, LOGICAL_AND(status = 'shipped') AS all_shipped FROM orders GROUP BY customer_id |
上記の場合はcustomer_id = 10 の人だけ全ての注文が出荷済みになっていないことがわかる。
このように、LOGICAL_AND
は直感的な書き方で「すべて満たすか」の判定をチェックできる点が特長だ。
LOGICAL_ANDが活きる実務例
LOGICAL_AND
は「すべてがTRUEかどうか」の判定が求められる実務シーンで特に威力を発揮する。
例1:全従業員が研修を修了しているか判定したい
1 2 3 4 5 |
SELECT LOGICAL_AND(training_completed) AS all_trained FROM employees |
TRUEであれば全員修了、FALSEなら未修了者がいる、という判定が可能。
例2:部署ごとに全員が条件を満たしているか判定
部署(department)ごとにグループ化して、その部署の中で全員が研修完了(training_completed)されているかをチェックする。
1 2 3 4 5 6 7 8 |
SELECT department, LOGICAL_AND(training_completed) AS all_trained FROM employees GROUP BY department |
これにより、部署ごとに全員が条件を満たしているかを一目で確認できる。
NULLやFALSEを含む場合の挙動
LOGICAL_AND
は、引数の中に FALSE が1つでもあれば必ず FALSE を返す。
全てが TRUE の場合のみTRUEを返すが、すべて NULL の場合のみ NULL を返す。
この全て NULL の場合のみ、というのが注意点だ。
仮に、TRUEとNULLが含まれる場合、NULLはTRUEとみなされ、全体はTRUEとなってしまうのだ。
CASE WHENとの組み合わせ例
もし、「未回答(NULL)」を FALSE 扱いにしたい場合は、CASE式で調整すればOKだ。
1 2 3 4 5 |
SELECT LOGICAL_AND(CASE WHEN training_completed IS NULL THEN FALSE ELSE training_completed END) AS all_trained FROM employees |
この場合、NULL は CASE文でFALSEに変換されるので、1つでも NULL があれば、LOGICAL_AND
の結果はFALSEになる。
まとめ
LOGICAL_ANDは「すべてが条件を満たしているか?」を一括判定できる強力な集約関数だ。
フラグの一括検証や品質チェックなど、様々なシーンで重宝する。
一方で、NULLやFALSEの扱い、条件式の書き方には注意が必要なのは、前述したとおりだ。
業務要件を的確に反映した論理判定を行うために、LOGICAL_ANDの仕様と特徴を理解し、CASE式などと柔軟に組み合わせて使いこなしてほしい。
適切に活用できれば、BigQueryでのデータ集約や一括判定業務を効率化できるはずだ。