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

【MySQL】空文字やNULLを除外し、対応する列の値で補完してデータを取得する方法

はじめに

MySQLでは、テーブル内に空文字('')やNULLが混在していることがあります。本記事では、空文字およびNULL以外の値だけを取得し、該当しない場合には別の列の値で補完する方法を、実際のSQL例とともにわかりやすく解説します。

サンプルテーブルの作成

まず、動作確認用のテーブルを作成しましょう。

mysql> create table DemoTable839(
    StudentFirstName varchar(100),
    StudentLastName varchar(100)
);
Query OK, 0 rows affected (0.69 sec)

続いて、insertコマンドで複数のレコードを挿入します。ここでは、意図的に空文字NULLを含むデータも登録しています。

mysql> insert into DemoTable839 values('Chris','Brown');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable839 values('','Taylor');
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable839 values(NULL,'Taylor');
Query OK, 1 row affected (0.15 sec)
mysql> insert into DemoTable839 values('Adam','Smith');
Query OK, 1 row affected (0.12 sec)

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

mysql> select *from DemoTable839;

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

+------------------+-----------------+
| StudentFirstName | StudentLastName |
+------------------+-----------------+
| Chris            | Brown           |
|                  | Taylor          |
| NULL             | Taylor          |
| Adam             | Smith           |
+------------------+-----------------+
4 rows in set (0.00 sec)

StudentFirstName列には「Chris」「Adam」という有効な値のほかに、空文字とNULLが含まれているのがわかります。

空文字・NULL以外の値を取得するクエリ

それでは本題です。以下のクエリを実行すると、StudentFirstName列から空文字とNULLを除外し、これらに該当する行についてはStudentLastName列の値で補完した結果を取得できます。

mysql> select if(length(StudentFirstName),StudentFirstName,StudentLastName) from DemoTable839;

実行結果は次のようになります。

+---------------------------------------------------------------+
| if(length(StudentFirstName),StudentFirstName,StudentLastName) |
+---------------------------------------------------------------+
| Chris                                                         |
| Taylor                                                        |
| Taylor                                                        |
| Adam                                                          |
+---------------------------------------------------------------+
4 rows in set (0.00 sec)

クエリの仕組み

このクエリのポイントは、IF()関数LENGTH()関数の組み合わせです。

  • LENGTH(StudentFirstName):文字列の長さを返します。空文字の場合は「0」、NULLの場合は「NULL」を返します。
  • IF(条件, 真の場合の値, 偽の場合の値):条件が真(0以外)なら第2引数を、偽(0またはNULL)なら第3引数を返します。

つまり、StudentFirstNameに有効な値が入っていればそのまま返され、空文字やNULLの場合は代わりにStudentLastNameの値が返されるという仕組みです。

代替手段:COALESCEとNULLIFを活用

同様の処理は、COALESCE()NULLIF()を組み合わせても実現できます。

mysql> select coalesce(nullif(StudentFirstName,''),StudentLastName) from DemoTable839;

NULLIFは2つの値が等しい場合にNULLを返すため、空文字をNULLに変換できます。さらにCOALESCEが最初のNULL以外の値を返すことで、同じ結果が得られます。用途に応じて使い分けるとよいでしょう。

まとめ

MySQLで空文字やNULLを含む列から有効な値のみを取得したい場合は、IF()とLENGTH()を組み合わせる方法がシンプルで効果的です。また、COALESCE()とNULLIF()を使った方法も可読性が高くおすすめです。データのクレンジングや表示用のクエリ作成の際に、ぜひ活用してください。

  1. MySQLでNULLを含む列からNULL以外(NOT NULL)の値だけを抽出して表示する方法

    MySQLのIS NOT NULLを使ってNULL以外の値のみを表示するMySQLで、NULLとNULL以外のレコードが混在する列からNULL以外の値だけを取得したい場合は、IS NOT NULL演算子を使用します。この記事では、実際にテーブルを作成しながら手順を解説します。1. テーブルの作成まず、日付型の列を持つサンプルテーブルを作成します。mysql> create table DemoTable1      (      DueDate date      ); Query OK, 0 ro

  2. MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方

    MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829      (      Name varchar(