0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【BigQuery】IN 句内がサブクエリの場合は実行計画が変わったので備忘録

Last updated at Posted at 2024-12-27

タイトルのとおり。
環境は Google Cloud の BigQuery。
以下の food テーブルがある(カラム名も food で少しややこしい)。

SELECT food
FROM `PROJECT_ID.DATASET_ID.food`

-- food
-- ぶどう
-- バナナ
-- りんご

実行計画を確認するためのコマンド:
bq show --format=prettyjson --job PROJECT_ID:JOB_ID | jq '.statistics.query.queryPlan'

(a) エラーにならない

理由(推測含む): 実行計画を見ると、(a1) と (a2) が同時に実行され、AND 条件の短絡評価により、(a2) ではぶどうのレコードは評価されないためエラーにならない。

SELECT food
FROM `PROJECT_ID.DATASET_ID.food`
WHERE
  food IN ('りんご') -- (a1)
  AND CASE -- (a2)
    WHEN food = 'ぶどう' THEN ERROR('エラー')
    ELSE TRUE
  END;

(b) エラーになる

理由(推測含む): 実行計画を見ると、(b2) は単独で food テーブルに対して実行され、ぶどうのレコードが評価されるためエラーになる。

SELECT food
FROM `PROJECT_ID.DATASET_ID.food`
WHERE
  food IN (SELECT 'りんご') -- (b1)
  AND CASE --(b2)
    WHEN food = 'ぶどう' THEN ERROR('エラー')
    ELSE TRUE
  END;

(c) エラーになる

理由(推測含む): OR 条件なので (c2) でぶどうのレコードが評価されてエラーになる。

SELECT food
FROM `PROJECT_ID.DATASET_ID.food`
WHERE
  food IN ('りんご') -- (c1)
  OR CASE -- (c2)
    WHEN food = 'ぶどう' THEN ERROR('エラー')
    ELSE TRUE
  END;
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?