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

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の扱いに注意してクエリを設計することが重要です。

  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で複数のカラムにNULL値を含むレコードを検索する方法

    はじめにMySQLで複数のカラムの中にNULL値が1つでも含まれているレコードを抽出したい場合、GREATEST()関数を活用するのが効果的です。GREATEST()は引数の中から最大値を返す関数ですが、引数のいずれかにNULLが含まれている場合、結果もNULLを返すという特性があります。この特性を利用すれば、複数カラムにわたるNULL値のチェックをシンプルな条件式で実現できます。この記事では、実際にテーブルを作成し、サンプルデータを挿入して、NULL値を含むレコードを検索する手順を順番に解説します。テーブルの作成まず、4つのINT型カラムを持つテーブルを作成しましょう。mysql> c