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