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

MySQLのIFNULL()関数とNULLIF()関数の違いとは?区別する方法をわかりやすく解説

MySQLのIFNULL()関数とNULLIF()関数の構文

MySQLには、NULL値を扱うための便利な関数としてIFNULL()NULLIF()が用意されています。この2つの関数は、一見するとよく似ていますが、実はまったく異なる目的で使用されます。まずは、それぞれの構文を見てみましょう。どちらも以下のようにほぼ同じ形式になっています。

IFNULL()関数の構文

IFNULL(expression1, expression2)

NULLIF()関数の構文

NULLIF(expression1, expression2)

2つの関数を区別するポイント

両者を区別する鍵は、「どのような条件で第1引数を結果として返すか」という点にあります。

  • IFNULL()関数: 第1引数がNULLでない場合に、その第1引数を返します。NULLであった場合は第2引数を返します。
  • NULLIF()関数: 2つの引数が等しくない場合に、第1引数を返します。2つの引数が等しい場合はNULLを返します。

実際の動作例

次の例では、両方の関数に「Ram」と「Shyam」という2つの文字列を渡しています。

mysql> Select IFNULL('Ram','Shyam');
+-----------------------+
| IFNULL('Ram','Shyam') |
+-----------------------+
| Ram                   |
+-----------------------+
1 row in set (0.00 sec)

mysql> Select NULLIF('Ram','Shyam');
+-----------------------+
| NULLIF('Ram','Shyam') |
+-----------------------+
| Ram                   |
+-----------------------+
1 row in set (0.00 sec)

上記の実行結果を見ると、どちらも「Ram」を返しているため、2つの関数は同じように動作しているように見えるかもしれません。しかし、その理由はまったく異なります。

  • IFNULL('Ram','Shyam') が「Ram」を返したのは、「Ram」が第1引数であり、NULLではないからです。
  • NULLIF('Ram','Shyam') が「Ram」を返したのは、「Ram」が第1引数であり、第2引数の「Shyam」と値が異なるからです。

まとめ:使い分けの早見表

関数名返す値の条件主な用途
IFNULL()第1引数がNULLでなければ第1引数、NULLなら第2引数NULL値の代替値への置き換え
NULLIF()2つの引数が異なれば第1引数、等しければNULL特定の値をNULLとして扱いたい場合

このように、IFNULL()は「NULL対策」のための関数、NULLIF()は「値の比較によってNULLを作り出す」ための関数と覚えておくと、適切に使い分けることができます。

  1. MySQLで今日から7日前までの日付データを取得する方法

    特定の期間内の日付データを取得するには、DATE()関数とINTERVAL演算子を組み合わせて使用します。ここでは、今日から7日前までの間に該当するレコードを抽出する方法を解説します。select *from yourTableName where DATE(yourColumnName) > (NOW() - INTERVAL 7 DAY);注意: 現在の日付が「2019-06-02」であると仮定して説明します。まずはサンプル用のテーブルを作成しましょう。mysql> create table DemoTable     (  &

  2. MySQLで1980年〜1996年生まれのユーザーの割合(パーセンテージ)を求める方法

    MySQLでは、SUM()関数とCOUNT()関数を組み合わせることで、特定の条件に該当するレコードの割合(パーセンテージ)を簡単に算出できます。この記事では、生年月日が1980年から1996年の間であるユーザーの割合を求める方法を、具体的なサンプルとともに分かりやすく解説します。サンプルテーブルの作成まず、デモ用のテーブルを作成しましょう。mysql> create table DemoTable-> (-> DateOfBirth varchar(100)-> );Query OK, 0 rows affected (0.55 sec)データの挿入次に、INSERT