MySQLで値を連結しながらNULL値を処理する方法(CONCAT・IFNULL活用)
CONCAT()とIFNULL()を使った基本的な構文
MySQLではCONCAT()関数を使用することで複数の値を連結できます。さらにIFNULL()関数を組み合わせれば、NULL値を任意の文字列に置き換えて処理することも可能です。
NULLが含まれるカラムをCONCAT()でそのまま連結すると、結果全体がNULLになってしまうため、IFNULL()で代替文字列を指定するのが実務上のポイントです。基本の構文は以下の通りです。
SELECT
CONCAT('anyStringValue:', IFNULL(yourColumnName, 'anyStringValue')) AS anyVariableName
FROM yourTableName;サンプルテーブルを作成する
それでは、実際の動作を確認するためにテーブルを作成しましょう。以下のクエリを実行します。
mysql> create table ConcatValues
-> (
-> Id int NOT NULL AUTO_INCREMENT,
-> FirstName varchar(20),
-> MiddleName varchar(20),
-> LastName varchar(20),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.62 sec)これは名前(FirstName)・ミドルネーム(MiddleName)・苗字(LastName)を格納するシンプルなテーブルです。MiddleNameには意図的にNULLを含むデータを挿入していきます。
テストデータの挿入
INSERT文を使って、いくつかのレコードを登録します。
mysql> insert into ConcatValues(FirstName,MiddleName,LastName) values('Mary','Elizabeth','Smith');
Query OK, 1 row affected (0.24 sec)
mysql> insert into ConcatValues(FirstName,MiddleName,LastName) values('John',NULL,'Smith');
Query OK, 1 row affected (0.24 sec)
mysql> insert into ConcatValues(FirstName,MiddleName,LastName) values('Carol',NULL,'Taylor');
Query OK, 1 row affected (0.16 sec)
mysql> insert into ConcatValues(FirstName,MiddleName,LastName) values('David',NULL,'Miller');
Query OK, 1 row affected (0.23 sec)登録したデータの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from ConcatValues;
実行結果は以下の通りです。
+----+-----------+------------+----------+ | Id | FirstName | MiddleName | LastName | +----+-----------+------------+----------+ | 1 | Mary | Elizabeth | Smith | | 2 | John | NULL | Smith | | 3 | Carol | NULL | Taylor | | 4 | David | NULL | Miller | +----+-----------+------------+----------+ 4 rows in set (0.00 sec)
Maryのレコードにはミドルネーム「Elizabeth」が登録されていますが、John・Carol・Davidの3件はMiddleNameがNULLになっています。
NULL値を処理しながら値を連結するクエリ
ここで本題となる、NULLを考慮しながら値を連結するクエリを見てみましょう。
mysql> select
-> concat('The middle name is:', IFNULL(MiddleName, 'Not Available')) AS MiddleName
-> from ConcatValues;実行結果は以下の通りです。
+----------------------------------+ | MiddleName | +----------------------------------+ | The middle name is:Elizabeth | | The middle name is:Not Available | | The middle name is:Not Available | | The middle name is:Not Available | +----------------------------------+ 4 rows in set (0.00 sec)
MiddleNameが「Elizabeth」のレコードはそのまま連結され、NULLのレコードには代わりに「Not Available」という文字列が表示されました。このようにIFNULL()を使えば、NULLによって連結結果全体がNULLになる問題を簡単に回避できます。
まとめ
- CONCAT():複数の文字列やカラムの値を連結する関数
- IFNULL():第1引数がNULLの場合に第2引数の値を返す関数
- NULLを含む可能性があるカラムを連結する場合は、IFNULL()で代替値を指定しておくと安全
なお、同じ用途にはCOALESCE()関数も利用できます。COALESCE()は複数の引数を受け取り、最初にNULL以外だった値を返すため、より柔軟な条件分岐的な処理が必要な場合に便利です。状況に応じて使い分けるとよいでしょう。
-
MySQLで空文字('')とNULLの両方を一緒に取得・表示するクエリの書き方
MySQLで空文字とNULLを同時に検索するにはMySQLにおいて、NULL値をチェックするには IS NULL を使用します。一方、空文字(空の値)は IS NULL では判定できないため、空の文字列 との比較が必要です。ここでは、両方を一度に抽出する方法を例とともに解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable691( PlayerId int NOT NULL AUTO_INCREMENT PRIMARY KEY, PlayerName varchar(100), PlayerSco
-
【MySQL】空の値(空文字列)をNULLに変換するUPDATEクエリの書き方
MySQLでは、UPDATE文のSET句とWHERE句を組み合わせるだけで、カラムに入っている空の値(空文字列)をNULLへ簡単に変換できます。ここからは、実際のサンプルを使って手順を詳しく解説していきます。 1. サンプルテーブルを作成する まず、以下のコマンドでテーブルを作成しましょう。 mysql> create table DemoTable1315 -> ( -> CountryName varchar(10) -> ); Query OK, 0 rows affected (0.60 sec) 2. レコードを挿入する 次に、INSERTコマンドでレコー