タイトルのとおり。
環境は 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;