1
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?

技術者あるある話 ~データベースコメントに騙されないで!~

1
Posted at

はじめに

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チェックを忘れない。

おわりに

「当たり前だろう」と思った仕様に限って落とし穴があるものです。
新人の方はぜひ「疑う姿勢」を持ち、先輩の方は「実データの確認もタスクに含める」よう指導してあげてください。

1
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
1
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?