危険察知4 択難易度 標準

状況

orders からテスト注文(is_test = 1)のうち、status が cancelled か failed のものだけを消す。DELETE の前に、同じ条件で件数を数える。

空欄に入る条件として正しいものは?

SELECT COUNT(*) AS n FROM ordersWHERE ____;

正答

  1. is_test = 1 AND status = 'cancelled' OR status = 'failed'
  2. is_test = 1 AND status IN ('cancelled', 'failed')
  3. is_test = 1 OR status IN ('cancelled', 'failed')
  4. is_test = 1 AND status = 'cancelled' AND status = 'failed'

解説

SQL では AND が OR より優先されるため、選択肢 1 は (is_test = 1 AND status = 'cancelled') OR status = 'failed' と解釈され、本番の注文でも failed なら対象になる。このまま DELETE に流すと実際の注文が消える。status IN ('cancelled', 'failed') か括弧で OR をまとめるのが正しい。選択肢 3 はテスト注文でない行まで含み、選択肢 4 は 1 つの列が 2 つの値に同時に等しいことはないので 0 件になる。

参考: www.sqlite.org

sqlwhereand-orprecedence

この問題を含む 危険察知 のテストを制限時間つきで解く

危険察知クイズへ