0
0

More than 3 years have passed since last update.

CASE式でNULLを用いる際の注意点

Posted at

はじめに

前の2記事の知識をベースとして、本記事は具体例を述べています。

気になった方、前提知識がない方は下記の記事をご覧ください。

実行結果はこちらで確認できます。

CASE式でNULLを用いる際の注意点

スキーマの定義は以下とします。

Schema (MySQL v5.7)

CREATE TABLE companies (
  id INT NOT NULL PRIMARY KEY auto_increment,
  company_name TEXT,
  company_group_id INT,
  address TEXT
);

INSERT INTO companies VALUES
    (1, 'ACE', 1, 'Japan Tokyo chiyoda 1-1'),
    (2, 'ACE_1', 1, 'Japan Tokyo chiyoda 1-1'),
    (3, 'ACE_2', NULL, 'Japan Tokyo chiyoda 1-2'),
    (4, 'RAINBOW_MEAL', 2, 'Japan Tokyo koukyogaien 1-1'),
    (5, 'STEP_INDUSTRY', 3, 'Japan Osaka fuchu midorigaoka 1-1');

クエリにて、company_group_id から グループ名を命名したいとき CASE式を用いる際の注意点です。

Query

SELECT
    company_name,
    CASE
        WHEN company_group_id = 1 THEN ' ACE_group'
        WHEN company_group_id = NULL THEN 'unknown'
        ELSE 'other'
    END AS group_name
FROM companies
company_name group_name
ACE ACE_group
ACE_1 ACE_group
ACE_2 other
RAINBOW_MEAL other
STEP_INDUSTRY other

ACE_2は NULLなので、unknownとなって欲しいところですが、otherとなりました。

なぜおかしいかは、こちらの記事に詳細書いてます。

ACE_2は NULLなので、unknownとなってくれるクエリは

SELECT
    company_name,
    CASE
        WHEN company_group_id = 1 THEN ' ACE_group'
        WHEN company_group_id IS NULL THEN 'unknown'
        ELSE 'other'
    END AS group_name
FROM companies

ですね。

company_name group_name
ACE ACE_group
ACE_1 ACE_group
ACE_2 unknown
RAINBOW_MEAL other
STEP_INDUSTRY other

ACE_2group_nameunknownとなってくれました。

大事なのは、NULLは値ではないということを理解しているかです。

今回は以上です!

参照

68p

アウトプット100本ノック実施中

0
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
0
0