MySQLでフィールドが空文字列かNULLかを判定する方法【CASE文活用】
MySQLにおけるNULLと空文字列の違い
MySQLでは、NULLと空文字列('')はまったく別のものとして扱われます。NULLは「値そのものが存在しない」状態を表し、空文字列は「長さ0の文字列が格納されている」状態を意味します。この2つを混同すると、データ検索や集計で意図しない結果を招くことがあるため注意が必要です。
フィールドが空文字列なのかNULLなのか、あるいは有効な値なのかを一括で判定したい場合は、CASE文とIS NULL演算子を組み合わせるのが効果的です。まずは基本となる構文を見てみましょう。
SELECT *, CASE
WHEN yourColumnName = '' THEN 'yourMessage1'
WHEN yourColumnName IS NULL THEN 'yourMessage2'
ELSE CONCAT(yourColumnName , ' is a Name')
END AS anyVariableName
FROM yourTableName;
サンプルテーブルの作成
構文の動作を確認するため、実際にテーブルを作成してみます。次のクエリを実行してください。
mysql> create table checkFieldDemo
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> Name varchar(10),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.64 sec)
テストデータの挿入
続いて、INSERT文を使ってNULLと空文字列を含むテストデータを登録します。
mysql> insert into checkFieldDemo(Name) values(NULL);
Query OK, 1 row affected (0.17 sec)
mysql> insert into checkFieldDemo(Name) values('John');
Query OK, 1 row affected (0.15 sec)
mysql> insert into checkFieldDemo(Name) values(NULL);
Query OK, 1 row affected (0.10 sec)
mysql> insert into checkFieldDemo(Name) values('');
Query OK, 1 row affected (0.51 sec)
mysql> insert into checkFieldDemo(Name) values('Carol');
Query OK, 1 row affected (0.14 sec)
mysql> insert into checkFieldDemo(Name) values('');
Query OK, 1 row affected (0.17 sec)
mysql> insert into checkFieldDemo(Name) values(NULL);
Query OK, 1 row affected (0.10 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from checkFieldDemo;
実行結果は以下の通りです。NULLと空文字列が混在した7件のレコードが登録されています。
+----+-------+
| Id | Name |
+----+-------+
| 1 | NULL |
| 2 | John |
| 3 | NULL |
| 4 | |
| 5 | Carol |
| 6 | |
| 7 | NULL |
+----+-------+
7 rows in set (0.00 sec)
CASE文によるNULL・空文字列の判定実行例
それでは、CASE文を使って各レコードが「NULL」「空文字列」「通常の名前」のどれに該当するかを判定してみます。
mysql> select *,case
-> when Name='' then 'It is an empty string'
-> when Name is null then 'It is a NULL value'
-> else concat(Name,' is a Name')
-> END as ListOfValues
-> from checkFieldDemo;
実行結果は以下の通りです。
+----+-------+-----------------------+
| Id | Name | ListOfValues |
+----+-------+-----------------------+
| 1 | NULL | It is a NULL value |
| 2 | John | John is a Name |
| 3 | NULL | It is a NULL value |
| 4 | | It is an empty string |
| 5 | Carol | Carol is a Name |
| 6 | | It is an empty string |
| 7 | NULL | It is a NULL value |
+----+-------+-----------------------+
7 rows in set (0.00 sec)
まとめ
このように、CASE文の中で= ''による空文字列の比較とIS NULLによるNULL判定を組み合わせることで、1つのクエリで両者を正確に区別できます。NULLと空文字列では挙動が異なるため、WHERE句でデータを絞り込む際にも同様の考え方を適用するとよいでしょう。
-
MySQLでフィールドがNULLの場合に別のフィールドの値を取得する方法(COALESCE関数の使い方)
MySQLでは、COALESCE()関数を使うことで、指定したフィールドがNULLだった場合に、代わりに別のフィールドの値を取得できます。COALESCE()は、引数として渡された値の中から最初に見つかったNULL以外の値を返す関数です。1. サンプルテーブルの作成まず、以下のコマンドでテーブルを作成します。mysql> create table DemoTable1470 -> ( -> FirstName varchar(20), -> Age int -> );Query OK, 0 rows affected (0.57 sec)2
-
MySQLストアドプロシージャでNULLまたは空の変数をチェックする方法
MySQLのストアドプロシージャ内で、変数がNULLまたは空文字列であるかどうかを判定するには、IF条件を使用します。NULLチェックには「IS NULL」、空文字列のチェックには「= 」を組み合わせることで、どちらのケースにも対応できます。それでは、実際にストアドプロシージャを作成してみましょう。mysql> delimiter //mysql> create procedure checkingForNullDemo(Name varchar(20)) begin