SQL Server での NULL 値と不等号演算子 (<>, !=) の罠
SQL Server での NULL 値と不等号演算子 (<>, !=)
NULL
値は、データが存在しないことを表します。これは、値が欠損している、または値が不明であることを意味します。
不等号演算子 (<>, !=) は、2 つの値が等しくないかどうかを比較します。
NULL 値と不等号演算子の動作
NULL
値を含む比較は、常に NULL
値を返します。これは、NULL
値が他のどの値とも比較できないためです。
例:
SELECT 1 <> NULL; -- 結果: NULL
SELECT 'a' <> NULL; -- 結果: NULL
SELECT NULL <> NULL; -- 結果: NULL
上記の例では、すべての比較結果は NULL
値になります。
SELECT NULL <> NULL; -- 結果: NULL
IS NULL
演算子は、値が NULL
かどうかを検査します。
SELECT 1 IS NULL; -- 結果: FALSE
SELECT 'a' IS NULL; -- 結果: FALSE
SELECT NULL IS NULL; -- 結果: TRUE
SELECT 1 IS NOT NULL; -- 結果: TRUE
SELECT 'a' IS NOT NULL; -- 結果: TRUE
SELECT NULL IS NOT NULL; -- 結果: FALSE
まとめ
NULL
値を含む比較は、常にNULL
値を返す。
これらの点を理解することで、NULL
値と不等号演算子の動作を正しく理解し、意図した結果を得ることができます。
-- テーブル作成
CREATE TABLE dbo.Test
(
ID INT,
Name VARCHAR(50),
Age INT
);
-- データ挿入
INSERT INTO dbo.Test (ID, Name, Age) VALUES (1, 'John Doe', 30);
INSERT INTO dbo.Test (ID, Name, Age) VALUES (2, 'Jane Doe', NULL);
INSERT INTO dbo.Test (ID, Name, Age) VALUES (3, NULL, 40);
-- SELECT ステートメント
SELECT *
FROM dbo.Test;
-- 結果
-- ID | Name | Age
-- -- | -- | --
-- 1 | John Doe | 30
-- 2 | Jane Doe | NULL
-- 3 | NULL | 40
-- 不等号演算子
SELECT ID, Name, Age,
Age <> NULL AS IsAgeNotNull,
Age IS NOT NULL AS IsAgeNotNull2
FROM dbo.Test;
-- 結果
-- ID | Name | Age | IsAgeNotNull | IsAgeNotNull2
-- -- | -- | -- | -- | --
-- 1 | John Doe | 30 | TRUE | TRUE
-- 2 | Jane Doe | NULL | FALSE | FALSE
-- 3 | NULL | 40 | FALSE | TRUE
-- IS NULL 演算子
SELECT ID, Name, Age,
Name IS NULL AS IsNameNull,
Age IS NULL AS IsAgeNull
FROM dbo.Test;
-- 結果
-- ID | Name | Age | IsNameNull | IsAgeNull
-- -- | -- | -- | -- | --
-- 1 | John Doe | 30 | FALSE | FALSE
-- 2 | Jane Doe | NULL | FALSE | TRUE
-- 3 | NULL | 40 | TRUE | FALSE
このサンプルコードは、NULL
値と不等号演算子 (<>, !=) および IS NULL
演算子の動作を理解するのに役立ちます。
NULL 値の比較を行う他の方法
CASE
式を使用して、NULL
値を別の値と比較することができます。
SELECT ID, Name, Age,
CASE WHEN Age IS NULL THEN 'Unknown' ELSE Age END AS AgeText
FROM dbo.Test;
-- 結果
-- ID | Name | Age | AgeText
-- -- | -- | -- | --
-- 1 | John Doe | 30 | 30
-- 2 | Jane Doe | NULL | Unknown
-- 3 | NULL | 40 | 40
上記の例では、Age
列が NULL
の場合は "Unknown" という文字列を、NULL
でない場合は Age
列の値を AgeText
列に表示しています。
SELECT ID, Name, COALESCE(Age, 0) AS Age
FROM dbo.Test;
-- 結果
-- ID | Name | Age
-- -- | -- | --
-- 1 | John Doe | 30
-- 2 | Jane Doe | 0
-- 3 | NULL | 40
EXISTS
キーワードを使用して、NULL
値を含むかどうかを検査することができます。
SELECT ID, Name
FROM dbo.Test
WHERE EXISTS (SELECT * FROM dbo.TestDetails WHERE TestDetails.TestID = Test.ID);
-- 結果
-- ID | Name
-- -- | --
-- 1 | John Doe
上記の例では、dbo.TestDetails
テーブルに Test
テーブルの ID
と一致するレコードが存在する場合は、Test
テーブルのレコードをすべて表示します。
sql sql-server t-sql