はじめに
Webエンジニア歴4年、主にVB.NETとSQL Serverを使っています。
今回は新人時代にやらかした「コメントを信じすぎた失敗談」を共有します。
対象はSQLの基本が分かる駆け出しエンジニアの方(0~3年目くらい)です。
事の発端
あるWebサイトの改修で「条件によって〇/×を表示する」という単純な仕様を担当しました。
所要時間は1~2時間と見積もり、先輩も「妥当」と判断。安心して作業を始めました。
対象のSQLは以下のようなものでした。
-- COLUMN4と一致するデータを抽出
SELECT COLUMN1, COLUMN2, COLUMN3
FROM TABLE_A
WHERE COLUMN4 = @in_COLUMN4
テーブルの構成を見ると、COLUMN3 は 0:なし, 1:あり とコメントされていました。
COLUMN_1 -- ID (Int)
COLUMN_2 -- Name (VarChar)
COLUMN_3 -- Flag (Char) 0:なし,1:あり
COLUMN_4 -- Div (Char) 0:男,1:女
実装とテスト
そこで、以下のように修正しました。
SELECT COLUMN1, COLUMN2,
CASE WHEN COLUMN3 = '0' THEN '×'
ELSE '〇' END AS COLUMN3
FROM TABLE_A
WHERE COLUMN4 = @in_COLUMN4
テストデータで確認したところ、想定通り「0 → ×」「1 → 〇」で動作!
単体テストもパスし、自信満々で本番に投入しました。
失敗の瞬間
ところが…本番で表示が崩壊。
「×になるはずのデータ」が〇で表示されてしまったのです。
確認すると、原因は NULL の存在 でした。
CASE 文の ELSE に吸い込まれて、NULL値がすべて「〇」扱いになっていたのです。
正しい書き方
安全に書くなら以下のように明示すべきでした。
sql
SELECT COLUMN1, COLUMN2,
CASE WHEN COLUMN3 = '0' THEN '×'
WHEN COLUMN3 = '1' THEN '〇'
ELSE '' END AS COLUMN3
FROM TABLE_A
WHERE COLUMN4 = @in_COLUMN4
学び
今回の教訓は大きく2つです。
コメントは鵜呑みにしない
コメントや仕様書が正しいとは限らない。本番データを確認すべし。
NULLを想定する習慣を持つ
DBでは「0/1」の世界にも必ず例外が潜んでいる。NULLチェックを忘れない。
おわりに
「当たり前だろう」と思った仕様に限って落とし穴があるものです。
新人の方はぜひ「疑う姿勢」を持ち、先輩の方は「実データの確認もタスクに含める」よう指導してあげてください。