【徹底解説】SQL Server での NULL 比較:なぜ false になるのか、そしてその他の方法とは?
SQL Server で NULL = NULL
が false
となる理由
SQL Server において、NULL = NULL
という比較式は false
と評価されます。一見直感的に理解しにくい結果ですが、これは NULL の性質と、SQL における等号演算子の動作に起因しています。
NULL の性質
SQL における NULL は、単なる値ではなく、値が存在しないことを示す特殊な値です。つまり、NULL は "未知" または "存在しない" という状態を表します。
等号演算子の動作
SQL の等号演算子 (=
) は、2 つの値を比較し、論理的に等しいかどうかを判断します。しかし、NULL のような特殊な値の場合、通常の等価比較とは異なる動作となります。
NULL = NULL
の評価
NULL = NULL
という比較式において、2 つの NULL 値を比較しようとしています。しかし、NULL は "未知" または "存在しない" という状態を表すため、2 つの NULL 値が厳密に等しいかどうかを判断することはできません。
上記の理由から、SQL Server では NULL = NULL
は false
と評価されます。これは、NULL の性質と、SQL における等号演算子の動作に起因するものです。
- 代わりに
IS NULL
演算子を使用することで、NULL 値かどうかを判定することができます。 NULL = NULL
がfalse
と評価される理由は、データベースシステムによって異なる場合があります。
例
SELECT
CASE WHEN column_name IS NULL THEN 'NULL' ELSE column_name END AS value
FROM table_name;
-- サンプルコード:NULL の値を比較する
-- テーブルを作成
CREATE TABLE customers (
id INT PRIMARY KEY,
name VARCHAR(50),
email VARCHAR(100),
active BOOLEAN
);
-- データを挿入
INSERT INTO customers (id, name, email, active)
VALUES
(1, 'John Doe', '[email protected]', TRUE),
(2, 'Jane Doe', NULL, FALSE),
(3, 'Peter Jones', '[email protected]', TRUE);
-- NULL 値を比較する
SELECT
id,
name,
email,
active,
CASE WHEN email IS NULL THEN 'NULL' ELSE email END AS email_status
FROM customers;
-- 結果
id | name | email | active | email_status
---+--------------+-----------------+---------+--------------
1 | John Doe | johndoe@example.com | TRUE | johndoe@example.com
2 | Jane Doe | NULL | FALSE | NULL
3 | Peter Jones | peter@jones.com | TRUE | peter@jones.com
-- 解説
このサンプルコードでは、以下の処理を実行しています。
1. `customers` という名前のテーブルを作成します。このテーブルには、顧客情報に関する列 (`id`, `name`, `email`, `active`) が含まれています。
2. 3 件の顧客データをテーブルに挿入します。
3. `email` 列の値を検査し、NULL の場合は 'NULL' 文字列を、それ以外の場合は実際の値を出力するクエリを実行します。
このクエリ結果を見ると、`email` 列に NULL 値を持つ行では、`email_status` 列に 'NULL' という文字列が出力されていることが確認できます。これは、`NULL = NULL` が `false` と評価されるためです。
**補足**
* このサンプルコードは、SQL Server で NULL 値を比較する方法を示す一例です。他の方法もあります。
* NULL 値の比較方法については、使用しているデータベースシステムのドキュメントを参照してください。
IS NULL 演算子を使用する
IS NULL
演算子は、引数が NULL 値かどうかを検査します。この演算子は、NULL = NULL
と比較するよりも効率的で、可読性も高くなります。
SELECT
id,
name,
email,
active,
CASE WHEN email IS NULL THEN 'NULL' ELSE email END AS email_status
FROM customers;
上記の例では、email
列が NULLかどうかを検査し、NULL の場合は 'NULL' 文字列を、それ以外の場合は実際の値を出力しています。
COALESCE 関数を使用する
COALESCE
関数は、引数のリストを順番に検査し、最初の NULL 以外の値を返します。NULL 値の比較に代わる方法として使用できます。
SELECT
id,
name,
email,
active,
COALESCE(email, 'NULL') AS email_status
FROM customers;
上記の例では、email
列の値が NULL の場合は 'NULL' 文字列を、それ以外の場合は実際の値を email_status
列に出力しています。
CASE 式を使用する
CASE
式は、条件に応じて異なる値を返すことができます。NULL 値の比較に代わる方法として使用できます。
SELECT
id,
name,
email,
active,
CASE WHEN email IS NULL THEN 'NULL' ELSE email END AS email_status
FROM customers;
上記の例は、IS NULL
演算子を使用する例と同じです。
サブクエリを使用する
sql sql-server null