【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()を使った方法も可読性が高くおすすめです。データのクレンジングや表示用のクエリ作成の際に、ぜひ活用してください。
-
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
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(