MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

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以外だった値を返すため、より柔軟な条件分岐的な処理が必要な場合に便利です。状況に応じて使い分けるとよいでしょう。

  1. 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

  2. 【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コマンドでレコー