MySQLで2つの列の中から最大値を取得し、NULLを含むレコードも正しく扱う方法
MySQLには複数の値の中から最大値を返すGREATEST()関数があります。しかし、引数のどれかにNULLが含まれている場合、GREATEST()は結果としてNULLを返してしまうという注意点があります。
本記事では、IF()関数を使ってNULLを0に置き換えることで、2つの列の中から最大値を正しく取得する方法を、実際のSQL例とともに解説します。
サンプルテーブルの作成
まず、2つの整数型カラム(Value1、Value2)を持つテーブルを作成します。
mysql> create table DemoTable
-> (
-> Value1 int,
-> Value2 int
-> );
Query OK, 0 rows affected (0.77 sec)
テストデータの挿入
次に、INSERT文を使ってNULLを含むレコードをいくつか挿入します。
mysql> insert into DemoTable values(78,89);
Query OK, 1 row affected (0.17 sec)
mysql> insert into DemoTable values(19,null);
Query OK, 1 row affected (0.23 sec)
mysql> insert into DemoTable values(null,0);
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable values(null,95);
Query OK, 1 row affected (0.15 sec)
登録済みレコードの確認
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from DemoTable;
実行すると、以下のような結果が出力されます。
+--------+--------+
| Value1 | Value2 |
+--------+--------+
| 78 | 89 |
| 19 | NULL |
| NULL | 0 |
| NULL | 95 |
+--------+--------+
4 rows in set (0.00 sec)
このように、テーブルにはNULLを含む行が存在しています。
2つの列から最大値を取得するクエリ
ここでポイントになるのが、GREATEST()にNULLが渡されると結果がNULLになってしまう点です。そこで、IF(Value1 is null, 0, Value1)のように、NULLの場合は0に置き換えてからGREATEST()に渡します。
mysql> select greatest(if(Value1 is null,0,Value1),if(Value2 is null,0,Value2)) from DemoTable;
このクエリを実行すると、以下の出力が得られます。
+-------------------------------------------------------------------+
| greatest(if(Value1 is null,0,Value1),if(Value2 is null,0,Value2)) |
+-------------------------------------------------------------------+
| 89 |
| 19 |
| 0 |
| 95 |
+-------------------------------------------------------------------+
4 rows in set (0.00 sec)
補足:COALESCE()を使ったよりシンプルな書き方
COALESCE(列名, 0)を使えば、NULLなら0を返すという処理をより簡潔に記述できます。
mysql> select greatest(coalesce(Value1,0),coalesce(Value2,0)) as GreatestValue from DemoTable;
どちらの方法でも、NULLを含むレコードがあっても、各レコードごとの最大値を確実に取得できます。業務システムなどで数値比較を行う際は、NULLの扱いに注意してクエリを設計することが重要です。
-
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で複数のカラムにNULL値を含むレコードを検索する方法
はじめにMySQLで複数のカラムの中にNULL値が1つでも含まれているレコードを抽出したい場合、GREATEST()関数を活用するのが効果的です。GREATEST()は引数の中から最大値を返す関数ですが、引数のいずれかにNULLが含まれている場合、結果もNULLを返すという特性があります。この特性を利用すれば、複数カラムにわたるNULL値のチェックをシンプルな条件式で実現できます。この記事では、実際にテーブルを作成し、サンプルデータを挿入して、NULL値を含むレコードを検索する手順を順番に解説します。テーブルの作成まず、4つのINT型カラムを持つテーブルを作成しましょう。mysql> c