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