MySQLでNULL・空文字・空白を除外して有効な列の値だけを取得する方法
MySQLで空でない列の値を取得する基本構文
MySQLでデータを扱っていると、NULL値だけでなく、空文字('')や半角スペースのみが入ったレコードまで除外して、「実際に意味のある値」だけを取得したいケースによく出会います。
そんなときは IS NOT NULL 条件と TRIM() 関数を組み合わせるのが効果的です。基本の構文は以下のとおりです。
SELECT * FROM yourTableName WHERE yourColumnName IS NOT NULL AND TRIM(yourColumnName) <> '';
IS NOT NULL だけでは空文字やスペースのみのデータは除外できません。TRIM() 関数で前後の空白を取り除いた結果が空文字でないかも同時にチェックすることで、NULL・空文字・空白のすべてのパターンに対応できます。
サンプルテーブルの作成
それでは、実際の動作を確認するためにテーブルを作成してみましょう。以下のクエリを実行します。
mysql> create table SelectNonEmptyValues
-> (
-> Id int not null auto_increment,
-> Name varchar(30),
-> PRIMARY KEY(Id)
-> );
Query OK, 0 rows affected (0.62 sec)
Idカラムを自動採番の主キーとし、Nameカラムにvarchar(30)型の氏名データを格納するシンプルな構成です。
テストデータの挿入
次に、INSERT文でさまざまなパターンのデータを登録します。通常の文字列、NULL、空文字、空白のみの4種類を混ぜて挿入します。
mysql> insert into SelectNonEmptyValues(Name) values('John Smith');
Query OK, 1 row affected (0.20 sec)
mysql> insert into SelectNonEmptyValues(Name) values(NULL);
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectNonEmptyValues(Name) values('');
Query OK, 1 row affected (0.24 sec)
mysql> insert into SelectNonEmptyValues(Name) values('Carol Taylor');
Query OK, 1 row affected (0.13 sec)
mysql> insert into SelectNonEmptyValues(Name) values('DavidMiller');
Query OK, 1 row affected (0.28 sec)
mysql> insert into SelectNonEmptyValues(Name) values(' ');
Query OK, 1 row affected (0.18 sec)
全レコードの確認
SELECT文でテーブル内の全レコードを表示してみましょう。
mysql> select *from SelectNonEmptyValues;
実行結果は以下のとおりです。Id 2がNULL、Id 3が空文字、Id 6が半角スペースのみのデータとなっています。
+----+-----------------------+ | Id | Name | +----+-----------------------+ | 1 | John Smith | | 2 | NULL | | 3 | | | 4 | Carol Taylor | | 5 | DavidMiller | | 6 | | +----+-----------------------+ 6 rows in set (0.00 sec)
空でない値だけを抽出するクエリ
ここで本題となるクエリです。以下のように IS NOT NULL と TRIM() を組み合わせると、NULL・空文字・空白のみのデータをすべて除外して取得できます。
mysql> SELECT * FROM SelectNonEmptyValues WHERE Name IS NOT NULL AND TRIM(Name) <> '';
実行結果:
+----+--------------+ | Id | Name | +----+--------------+ | 1 | John Smith | | 4 | Carol Taylor | | 5 | DavidMiller | +----+--------------+ 3 rows in set (0.00 sec)
このように、Name IS NOT NULL AND TRIM(Name) <> '' という条件式を使えば、カラムの状態がNULL・空文字・スペースのいずれであっても対応できる、万能な抽出条件になります。実務のデータクレンジングや検索処理でも頻繁に使われるテクニックなので、ぜひ覚えておきましょう。
-
MySQLで列の値ごとに「NO」の件数のみをカウントして返すクエリの書き方
MySQLでは、SUM()関数と条件式を組み合わせることで、グループごとに特定の値(この例では「NO」)が出現した回数だけをカウントできます。ここでは、ENUM型のカラムを持つテーブルを例に、「NO」の件数のみを集計する方法を具体的な手順とともに解説します。 1. テーブルを作成する まず、サンプル用のテーブルを作成します。isTopperカラムはENUM型で、「YES」または「NO」のいずれかの値を持ちます。 mysql> create table DemoTable1829 ( Name varchar(
-
MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方
MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec