【MySQL】空白を含むレコードをDISTINCTで正しく重複排除する方法(REPLACE関数活用)
MySQLのDISTINCTは、見た目が同じでも前後に空白(スペース)が含まれているレコードを別々の値として扱ってしまいます。例えば「John」「John 」(末尾に空白)「 John 」(前後に空白)は、それぞれ異なるデータとして認識されるため、意図したとおりに重複を除去できません。
この問題を解決するには、REPLACE関数を使って空白を取り除いた上でDISTINCTを適用します。基本構文は以下のとおりです。
SELECT DISTINCT REPLACE(カラム名, ' ', '') FROM テーブル名;
サンプルテーブルの作成
まず、動作確認用のテーブルを作成しましょう。
mysql> CREATE TABLE DemoTable
(
Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name varchar(20)
);
Query OK, 0 rows affected (0.63 sec)テストデータの挿入
次に、INSERTコマンドを使って空白の有無が異なるレコードを挿入します。
mysql> INSERT INTO DemoTable(Name) VALUES('John ');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable(Name) VALUES(' John ');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('John');
Query OK, 1 row affected (0.09 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Sam');
Query OK, 1 row affected (0.15 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Carol');
Query OK, 1 row affected (0.22 sec)
mysql> INSERT INTO DemoTable(Name) VALUES(' Sam');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('Mike ');
Query OK, 1 row affected (0.12 sec)
mysql> INSERT INTO DemoTable(Name) VALUES('David');
Query OK, 1 row affected (0.17 sec)登録された全レコードの確認
SELECT文ですべてのレコードを表示してみます。
mysql> SELECT * FROM DemoTable;
実行結果は以下のとおりです。同じ名前でも空白の位置によって複数行に分かれています。
+----+-----------+ | Id | Name | +----+-----------+ | 1 | John | | 2 | John | | 3 | John | | 4 | Sam | | 5 | Carol | | 6 | Sam | | 7 | Mike | | 8 | David | +----+-----------+ 8 rows in set (0.00 sec)
REPLACE関数とDISTINCTを組み合わせたクエリ
ここで本題のクエリです。REPLACE関数で空白を削除してからDISTINCTを適用することで、空白の違いを無視した重複排除が可能になります。
mysql> SELECT DISTINCT REPLACE(Name, ' ', '') FROM DemoTable;
実行結果:
+----------------------+ | replace(Name,' ','') | +----------------------+ | John | | Sam | | Carol | | Mike | | David | +----------------------+ 5 rows in set (0.00 sec)
8件のレコードから、空白を除いた実際の名前は5種類であることが確認できました。「John」の3つのバリエーションや「Sam」の2つのバリエーションが、それぞれ1つにまとめられています。
補足:TRIM関数との違い
なお、先頭と末尾の空白だけを除去したい場合はTRIM関数を使う方法もあります。
SELECT DISTINCT TRIM(Name) FROM DemoTable;
REPLACEは文字列中のすべての空白を削除するのに対し、TRIMは先頭と末尾のみを対象とします。名前に途中のスペースを含みたいケース(例:「John Smith」)ではTRIMの方が適しているので、用途に応じて使い分けるとよいでしょう。
-
MySQLで日付から曜日名を取得する方法(DAYNAME関数の使い方)
MySQLで日付に対応する曜日名を取得するには?MySQLで日付データから曜日名(Sunday、Mondayなど)を取得したい場合は、DAYNAME()関数を使用します。この記事では、実際にテーブルを作成し、DAYNAME()関数を使って曜日名を取得する手順を解説します。1. テーブルを作成するまず、出荷日(ShippingDate)を格納するテーブルを作成しましょう。mysql> create table DemoTable1954 ( ShippingDate date ); Query OK, 0 rows affected (0.00 sec)2. レコー
-
MySQLで重複しない日付(個別の値)を表示する方法
MySQLでは、datetime型のカラムから「日付のみ」を基準に重複を排除してデータを取得したいケースがよくあります。例えば、同じ日に複数の注文や出荷記録がある場合、日付単位で1件だけ取り出したいときなどです。本記事では、GROUP BYとDATE()関数を組み合わせて、重複しない日付ごとのレコードを表示する方法を解説します。 1. サンプルテーブルを作成する まず、動作確認用のテーブルを作成しましょう。ここでは、出荷日時(ShippingDate)と顧客名(CustomerName)を持つテーブルを定義します。 mysql> create table DemoTable1996 (