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

MySQLで2つの列の値が異なる行をSELECT文で抽出する方法

MySQLで2つの列の値が異なる行を取得するには

MySQLでは、!=(または <>)演算子を使うことで、2つの列の値が一致しない行を抽出できます。ただし、NULLが含まれる可能性がある場合は注意が必要です。NULLとの比較は常にUNKNOWNと評価されるため、単純な != だけではNULLを含む行が結果から漏れてしまいます。

そこで、NULLのケースも考慮した構文は以下のようになります。

SELECT * FROM yourTableName
WHERE yourColumnName1 != yourColumnName2
OR (yourColumnName1 IS NULL AND yourColumnName2 IS NOT NULL)
OR (yourColumnName2 IS NULL AND yourColumnName1 IS NOT NULL);

ポイント:

  • 1つ目の条件 yourColumnName1 != yourColumnName2:両方の列に値があり、かつ異なる場合に該当します。
  • 2つ目・3つ目の条件:片方だけがNULLの場合に該当させ、NULLによる比較漏れを防ぎます。

サンプルテーブルを作成する

実際に動作を確認するため、テーブルを作成しましょう。テーブル作成のクエリは以下の通りです。

mysql> create table selectTwoColumns
    -> (
    -> Id int NOT NULL AUTO_INCREMENT,
    -> FirstNumber int,
    -> SecondNumber int,
    -> PRIMARY KEY(Id)
    -> );
Query OK, 0 rows affected (0.87 sec)

レコードを挿入する

次に、INSERTコマンドを使ってサンプルデータをいくつか挿入します。

mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(10,20);
Query OK, 1 row affected (0.29 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(30,40);
Query OK, 1 row affected (0.16 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(20,20);
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(50,60);
Query OK, 1 row affected (0.18 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(50,50);
Query OK, 1 row affected (0.17 sec)
mysql> insert into selectTwoColumns(FirstNumber,SecondNumber) values(70,NULL);
Query OK, 1 row affected (0.14 sec)

テーブルの全レコードを表示する

SELECT文ですべてのレコードを確認してみましょう。

mysql> select *from selectTwoColumns;

実行結果は以下の通りです。

+----+-------------+--------------+
| Id | FirstNumber | SecondNumber |
+----+-------------+--------------+
|  1 |          10 |           20 |
|  2 |          30 |           40 |
|  3 |          20 |           20 |
|  4 |          50 |           60 |
|  5 |          50 |           50 |
|  6 |          70 |         NULL |
+----+-------------+--------------+
6 rows in set (0.00 sec)

2つの列の値が異なる行を抽出するクエリ

それでは、FirstNumberとSecondNumberの値が同じではない行だけを取得するクエリを実行します。

mysql> select *from selectTwoColumns
    -> where FirstNumber!=SecondNumber
    -> OR (FirstNumber IS NULL AND SecondNumber IS NOT NULL)
    -> OR (SecondNumber IS NULL AND FirstNumber IS NOT NULL);

実行結果は以下の通りです。

+----+-------------+--------------+
| Id | FirstNumber | SecondNumber |
+----+-------------+--------------+
|  1 |          10 |           20 |
|  2 |          30 |           40 |
|  4 |          50 |           60 |
|  6 |          70 |         NULL |
+----+-------------+--------------+
4 rows in set (0.00 sec)

上記の出力を見ると、Id 1、2、4 のように両方の値が異なる行に加えて、Id 6 のように片方がNULLの行も正しく取得できていることがわかります。一方、値が同一である Id 3(20と20)や Id 5(50と50)は除外されています。

補足:NULL安全な比較方法

MySQLでは、<=>(NULL安全等価演算子)を組み合わせて NOT (a <=> b) のように書く方法もあります。この演算子はNULL同士を等しいとみなすため、NULLが含まれる場合でも1つの条件で簡潔に記述できるのが利点です。

  1. MySQLでWHERE IN句とNULLを組み合わせてレコードを取得する方法

    MySQLでは、WHERE IN句を使った検索時にNULL値を含む行も取得したいケースがあります。しかし、NULLは通常の比較演算子では正しく評価されないため、IS NULLを組み合わせる必要があります。本記事では、その具体的な方法をサンプルコードとともに解説します。基本の構文NULLを含めて検索する場合の基本的な構文は以下のとおりです。ポイントは、IN句の条件に加えて OR カラム名 IS NULL を追加することです。SELECT yourColumnName1, yourColumnName2, yourColumnName3, ... N FROM yourTabl

  2. 【C#入門】2つのStringオブジェクトが同じ値かどうかを確認する方法

    C#で2つの文字列(String)オブジェクトが同じ値を持っているかどうかを確認するには、Equals()メソッドを使用します。このメソッドは、2つの文字列の内容が一致していればtrueを、異なっていればfalseを返します。サンプルコード1:同じ値の場合まずは、2つの文字列が同じ値を持つ場合の例を見てみましょう。using System; public class Demo { public static void Main(String[] args){ string str1 = John; string str2 = John; Console