MySQLで空白の付き方が異なる複数の列から類似する名前を抽出する方法
はじめに
MySQLでは、見た目は同じ名前でも、前後に含まれる空白(スペース)の量が異なるために一致しないケースがあります。例えば「 John 」と「John」のように、左側や右側に余分な空白がある場合は、単純な等号(=)による比較ではマッチしません。
このような場合に役立つのが、LTRIM()関数とRTRIM()関数です。LTRIM()は文字列の先頭の空白を除去し、RTRIM()は末尾の空白を除去します。これらを組み合わせることで、空白の有無に関係なく名前を正確に比較できます。
サンプルテーブルの作成
まず、比較用のテーブルを作成しましょう。
mysql> create table DemoTable614(EnterName varchar(100),ReennterName varchar(100)); Query OK, 0 rows affected (0.97 sec)
レコードの挿入
insertコマンドを使って、いくつかのレコードを挿入します。意図的に空白の付き方が異なるデータを登録しています。
mysql> insert into DemoTable614 values(' John ','John');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable614 values('Carol ','Bob');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable614 values('David ','David');
Query OK, 1 row affected (0.23 sec)登録データの確認
select文で全レコードを表示してみましょう。
mysql> select *from DemoTable614;
以下のような出力が得られます。
+------------+--------------+ | EnterName | ReennterName | +------------+--------------+ | John | John | | Carol | Bob | | David | David | +------------+--------------+ 3 rows in set (0.00 sec)
一見すると「John」と「David」の行は両方の列で同じ名前に見えますが、実際にはEnterName列には余分な空白が含まれています。
空白を除去して比較するクエリ
次のクエリでは、LTRIM()とRTRIM()を入れ子にして両列の空白を除去した上で比較することで、空白の量が異なる列間でも類似する名前を正しく抽出できます。
mysql> select *from DemoTable614 where LTRIM(RTRIM(EnterName)) = LTRIM(RTRIM(ReennterName));
実行結果
+------------+--------------+ | EnterName | ReennterName | +------------+--------------+ | John | John | | David | David | +------------+--------------+ 2 rows in set (0.00 sec)
「Carol」と「Bob」のように名前そのものが異なる行は除外され、空白の違いを除いて実際に同じ名前である「John」と「David」の2行だけが返されています。
補足:TRIM()関数との違い
MySQLには、先頭と末尾の両方の空白を一度に除去できるTRIM()関数もあります。LTRIM(RTRIM(列名))と書く代わりにTRIM(列名)とすれば、より簡潔に同じ結果を得られます。状況に応じて使い分けるとよいでしょう。
-
MySQLで重複行を除外して1行だけ取得する方法(DISTINCTの使い方)
MySQLで重複行から1行のみを返すには?MySQLのテーブルに同じ値を持つ重複行が存在する場合、DISTINCTキーワードを使うことで、重複を排除した一意な行だけを取得できます。この記事では、実際にテーブルを作成し、データを挿入したうえで、DISTINCTによる重複除去の手順を解説します。1. テーブルを作成するまず、サンプル用のテーブルを作成します。mysql> create table DemoTable1998 ( Name varchar(20) ); Query OK, 0 rows affected (0.61 sec)2. レコードを挿入するINSERTコマンドを
-
MySQLのGROUP_CONCATで複数行の値を1つのフィールドにまとめてリストとして取得する方法
はじめにMySQLでは、複数の行に分かれている値を1つのフィールドに連結したリストとして取得したい場面がよくあります。たとえば、科目ごとに受講している学生名をカンマ区切りでまとめて表示したい場合などです。このような場合は、集約関数のGROUP_CONCAT()を使用することで簡単に実現できます。本記事では、実際にテーブルを作成し、サンプルデータを使いながらGROUP_CONCAT()の使い方を順を追って解説します。サンプルテーブルの作成まず、科目名(SubjectName)と学生名(StudentName)を持つテーブルを作成します。mysql> create table DemoTab