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

MySQLのIN()関数がNULLを返す2つのケースとは?具体例付きで解説

MySQLのIN()関数は、特定の条件下で結果としてNULLを返します。本記事では、IN()関数がNULLを返す2つのケースについて、実際の実行例とともにわかりやすく解説します。

ケース1: 左辺の式がNULLの場合

IN()関数は、左辺の式がNULLである場合にNULLを返します。これは、SQLにおいてNULLとの比較は常に「不明(UNKNOWN)」として扱われるためです。以下の例で確認してみましょう。

mysql> Select NULL IN (1,2,3,4,10);
+----------------------+
| NULL IN (1,2,3,4,10) |
+----------------------+
|         NULL         |
+----------------------+
1 row in set (0.00 sec)

上記の結果のように、左辺がNULLである場合、リスト内にどのような値があっても比較自体を判定できないため、結果はNULLになります。

ケース2: リスト内のいずれかの式がNULLで、かつ一致する値が見つからない場合

リスト内のいずれかの式がNULLであり、かつ一致する値が見つからない場合、IN()関数はNULLを返します。一方、リスト内に一致する値が存在すれば、他の要素にNULLが含まれていても結果は1(TRUE)となります。以下の例を見てみましょう。

mysql> Select 10 IN (NULL,11,12);
+--------------------+
| 10 IN (NULL,11,12) |
+--------------------+
|        NULL        |
+--------------------+
1 row in set (0.00 sec)

mysql> Select 10 IN (NULL,11,12,10);
+-----------------------+
| 10 IN (NULL,11,12,10) |
+-----------------------+
|           1           |
+-----------------------+
1 row in set (0.00 sec)

最初の例では、10はリスト(NULL, 11, 12)の中に存在しないため、結果はNULLとなっています。2番目の例では、リスト内に10が存在するため、NULLが含まれていても結果は1になります。

まとめ

IN()関数がNULLを返すのは、次の2つの場合です。

  • 左辺の式がNULLである場合
  • リスト内のいずれかの式がNULLで、かつ一致する値が見つからない場合

SQLにおけるNULLは「値が不明」であることを意味するため、このような挙動になります。NULLが含まれる可能性のあるカラムに対してIN()関数を使用する際は、IFNULL()やCOALESCE()などでNULLを事前に処理しておくと、意図しない結果を避けることができます。

  1. MySQLで入力がNULLの場合にDATE_FORMATからNULLを返す方法

    MySQLで入力がNULLの場合にDATE_FORMATからNULLを返す方法 MySQLでは、IF()関数を組み合わせることで、日付カラムの値がNULLの場合にDATE_FORMAT関数の結果としてNULLを返すことができます。NULLデータを含むテーブルでも、意図どおりに日付を安全にフォーマットできる便利なテクニックです。 基本構文 構文は以下のとおりです。 SELECT IF(対象の日付カラム, DATE_FORMAT(対象の日付カラム, %d/%m/%Y), NULL) FROM テーブル名; IF()関数は、第1引数の条件が真(NULL以外の有効な値)であれば第2引数を返し、条件が

  2. MySQLでNULLの値を別の列に0として表示する方法(CASE文の使い方)

    MySQLでは、カラムの値がNULLである場合に、SELECT文の結果として新しい列に0を返したいケースがよくあります。例えば、価格データの欠損値を集計や表示のために0として扱いたい場合などです。このような場合には、CASE文を使用するのが最も基本的な方法です。CASE文を使うことで、条件に応じて異なる値を返すことができます。1. サンプルテーブルを作成するまず、動作確認用のテーブルを作成しましょう。mysql> create table DemoTable703 (Price int); Query OK, 0 rows affected (0.46 sec)2. テストデータを挿入す