状況
2026 年より前のログを消す前の確認。created_at は 'YYYY-MM-DD' 形式の TEXT 列で、2025-11-30、2025-12-31、2026-01-15、2026-05-01、2026-10-16 の 5 行がある。作業者が条件を手で打った。
この確認 SELECT の結果は?
SELECT COUNT(*) AS n FROM logsWHERE created_at < '2026-1-1';正答
- 2。日付として比べられ、2025 年の 2 行だけが一致する
- 4。文字列比較で 2026 年 1 月と 5 月も含まれる
- 5。形式がそろっていないので、全行が一致する
- 0。形式が違う値どうしは比べられず、1 行も一致しない
解説
TEXT の比較は先頭から 1 文字ずつ行われる。'2026-01-15' と '2026-1-1' は 6 文字目の '0' と '1' で比べられ、'0' のほうが小さいので「より前」と判定される。'2026-05-01' も同じ。結果は 4 で、このまま DELETE すると 2026 年 1 月と 5 月のログまで消える。'2026-01-01' と書けば 2 になる。「2 件のはず」と予想してから実行し、数が違えば止まる。形式が違っても比較自体はエラーにならない。
参考: www.sqlite.org
この問題を含む 危険察知 のテストを制限時間つきで解く
危険察知クイズへ