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

MySQLで2つのカラムからNULL以外の値を抽出する4つの方法

MySQLでは、2つのカラムのうちNULLでない方の値を取得したい場面がよくあります。例えば、ユーザー情報の補完や、データクレンジング処理などがその代表例です。本記事では、NULL以外の値を優先的に選択するための方法を、代表的な4つの構文とともに詳しく解説します。

方法1:IFNULL()関数を使う

IFNULL()は、第1引数がNULLの場合に第2引数を返すシンプルな関数です。2つのカラムからNULL以外の値を取得する最も基本的な方法です。

構文は以下の通りです。

SELECT IFNULL(yourColumnName1, yourColumnName2) AS anyVariableName FROM yourTableName;

方法2:COALESCE()関数を使う

COALESCE()は、引数の中で最初に現れるNULL以外の値を返す標準SQL関数です。IFNULL()と異なり、3つ以上のカラムにも対応できる汎用性の高い関数です。

構文は以下の通りです。

SELECT COALESCE(yourColumnName1, yourColumnName2) AS anyVariableName FROM yourTableName;

方法3:CASE文を使う

CASE文を使用すれば、条件分岐のロジックを明示的に記述できます。より複雑な条件を組み合わせたい場合に有効です。

構文は以下の通りです。

SELECT CASE
WHEN yourColumnName1 IS NOT NULL THEN yourColumnName1 ELSE yourColumnName2
END AS anyVariableName
FROM yourTableName;

方法4:IF()関数を使う

MySQL独自のIF()関数を使う方法もあります。条件式が真なら第2引数、偽なら第3引数を返します。

構文は以下の通りです。

SELECT IF(yourColumnName1 IS NULL, yourColumnName2, yourColumnName1) AS NotNULLValue FROM SelectNotNullColumnsDemo;

検証用テーブルの作成

これらの構文の動作を確認するために、サンプルテーブルを作成しましょう。テーブル作成のクエリは次の通りです。

mysql> create table SelectNotNullColumnsDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> Name varchar(20),
    -> Age int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.86 sec)

続いて、INSERTコマンドでレコードを挿入します。意図的に片方のカラムだけNULLになるようにデータを入れています。

mysql> insert into SelectNotNullColumnsDemo(Name,Age) values('John',NULL);
Query OK, 1 row affected (0.16 sec)
mysql> insert into SelectNotNullColumnsDemo(Name,Age) values(NULL,23);
Query OK, 1 row affected (0.16 sec)

SELECT文ですべてのレコードを表示して確認します。

mysql> select * from SelectNotNullColumnsDemo;

実行結果は以下の通りです。

+----+------+------+
| Id | Name | Age  |
+----+------+------+
|  1 | John | NULL |
|  2 | NULL |   23 |
+----+------+------+
2 rows in set (0.00 sec)

このように、NameまたはAgeのどちらか一方がNULLになっている状態です。ここから、各方法を使ってNULL以外の値を抽出してみましょう。

方法1:IFNULL()の実行例

mysql> select ifnull(Name, Age) as NotNULLValue from SelectNotNullColumnsDemo;

NameがNULLのレコードではAgeの値(23)が、AgeがNULLのレコードではNameの値(John)が返されていることがわかります。

+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

方法2:COALESCE()の実行例

mysql> select coalesce(Name, Age) as NotNULLValue from SelectNotNullColumnsDemo;

結果はIFNULL()と同じになります。

+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

方法3:CASE文の実行例

mysql> select case
    -> when Name is not null then Name else Age
    -> end as NotNULLValue
    -> from SelectNotNullColumnsDemo;

こちらも同様に、NULL以外の値が正しく取得できています。

+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

方法4:IF()の実行例

mysql> select if(Name is NULL, Age, Name) as NotNULLValue from SelectNotNullColumnsDemo;
+--------------+
| NotNULLValue |
+--------------+
| John         |
| 23           |
+--------------+
2 rows in set (0.00 sec)

まとめ

いずれの方法でも、2つのカラムからNULL以外の値を取得することができました。使い分けの目安としては以下の通りです。

  • IFNULL():MySQL限定で、2つの値を扱うシンプルなケースに最適
  • COALESCE():標準SQL準拠のため移植性が高く、3つ以上のカラムにも対応可能
  • CASE文:複雑な条件分岐が必要な場合に柔軟に対応できる
  • IF():MySQL独自の関数で、条件付きの簡潔な記述が可能

可読性や他データベースへの移植性を考慮するならCOALESCE()の使用をおすすめします。

  1. MySQLで2つの列のすべての値をカウントし、NULL値を除外する方法

    MySQLでは、COUNT関数を組み合わせることで、複数の列に含まれるすべての値をカウントできます。COUNT関数はNULL値を自動的に除外するため、NULLが混在するデータでも正確な合計件数を取得できるのが特徴です。ここでは、2つの列の値をカウントし、NULL値を除外した合計カウントを求める方法を具体的な例で解説します。 1. サンプルテーブルの作成 まず、学生名と点数を格納するテーブルを作成します。 mysql> create table DemoTable1975     (     StudentNa

  2. MySQLで値が「0」の場合に別の列から値を取得する方法

    MySQLで値が「0」の場合に別の列から値を取得する方法MySQLでは、IF()関数を使用することで、特定の列の値が「0」だった場合に、別の列の値を代わりに取得できます。条件分岐を1つのクエリ内で簡単に実現できる便利な関数です。IF()関数の基本構文select IF(yourColumnName1=0,yourColumnName2,yourColumnName1) as anyAliasName from yourTableName;この構文では、最初の列の値が「0」であれば2番目の列の値を返し、「0」以外であれば最初の列の値をそのまま返します。サンプルテーブルの作成まず、動作確認用のテー