MySQLで列をソートする際に0を最後に表示させる方法
はじめに
MySQLでは、ORDER BY句を工夫して使うことで、列を昇順に並べ替えながら、値が0のレコードだけを最後に表示させることができます。ランキングや一覧表示などで「未設定のデータ(0)は後回しにしたい」というケースはよくありますが、本記事ではその具体的な方法をサンプルコードとともに解説します。
基本的な構文
0を最後に配置しながら列を並べ替えるには、以下の構文を使用します。
select *from yourTableName order by yourFieldName = 0,yourFieldName;
ポイントは「yourFieldName = 0」という比較式をORDER BYの第一ソートキーに指定することです。この式は、値が0のときに1(真)、それ以外のときに0(偽)を返します。その結果、0以外の値を持つレコードが先頭に来て、0のレコードが最後に回されます。第二キーの「yourFieldName」により、0以外の値は通常どおり昇順に並べ替えられます。
サンプルテーブルの作成
まず、動作を確認するためのテーブルを作成しましょう。以下のCREATE TABLE文を実行します。
mysql> create table SortColumnZeroAtLastDemo
-> (
-> RankNumber int
-> );
Query OK, 0 rows affected (1.40 sec)
レコードの挿入
次に、INSERT文を使ってテーブルにデータを登録します。ここでは、0を含む複数の数値を挿入します。
mysql> insert into SortColumnZeroAtLastDemo values(100);
Query OK, 1 row affected (0.20 sec)
mysql> insert into SortColumnZeroAtLastDemo values(0);
Query OK, 1 row affected (0.17 sec)
mysql> insert into SortColumnZeroAtLastDemo values(0);
Query OK, 1 row affected (0.11 sec)
mysql> insert into SortColumnZeroAtLastDemo values(50);
Query OK, 1 row affected (0.13 sec)
mysql> insert into SortColumnZeroAtLastDemo values(10);
Query OK, 1 row affected (0.15 sec)
mysql> insert into SortColumnZeroAtLastDemo values(0);
Query OK, 1 row affected (0.17 sec)
mysql> insert into SortColumnZeroAtLastDemo values(40);
Query OK, 1 row affected (0.12 sec)
テーブルの内容を確認する
SELECT文ですべてのレコードを表示してみましょう。
mysql> select *from SortColumnZeroAtLastDemo;
実行結果は以下のとおりです。
+------------+
| RankNumber |
+------------+
| 100 |
| 0 |
| 0 |
| 50 |
| 10 |
| 0 |
| 40 |
+------------+
7 rows in set (0.00 sec)
テーブルには100、0、0、50、10、0、40の7件のデータが格納されており、0のレコードが途中に散在していることがわかります。
0を最後にして並べ替えるクエリ
それでは、冒頭で紹介した構文を使って、値が0のレコードを最後に配置しながら列を並べ替えてみます。
mysql> select *from SortColumnZeroAtLastDemo order by RankNumber = 0,RankNumber;
実行結果は以下のとおりです。
+------------+
| RankNumber |
+------------+
| 10 |
| 40 |
| 50 |
| 100 |
| 0 |
| 0 |
| 0 |
+------------+
7 rows in set (0.00 sec)
出力結果を見ると、10、40、50、100と昇順に並べ替えられ、値が0の3件のレコードがすべて末尾にまとめられていることが確認できます。
まとめ
MySQLで列を並べ替える際に、特定の値(この例では0)だけを最後に表示したい場合は、「ORDER BY 列名 = 0, 列名」という形式が非常に有効です。比較式の戻り値(真偽)をソートキーとして利用するこの手法は、シンプルでありながら実務で応用範囲が広く、未設定データを一覧の末尾に追いやりたい場面などで活躍します。また、NULLを最後に表示したい場合も同様の考え方で「ORDER BY 列名 IS NULL, 列名」を使用できますので、あわせて覚えておくと便利です。
-
MySQLで特定の単語を無視してカラムを並べ替える方法
```html データベースの運用では、「name John 3」のように特定の接頭辞(プレフィックス)が付いた文字列データを扱うことがあります。このような場合、通常の ORDER BY でソートすると、その単語が含まれるレコードが意図しない順序になってしまうことがあります。 本記事では、MySQLの LOWER()、REPLACE()、TRIM() 関数を組み合わせて、特定の単語を無視してカラムを並べ替える方法を実例とともに解説します。 サンプルテーブルの作成 まず、テーブルを作成します。 mysql> create table DemoTable
-
MySQLテーブルで「year」をカラム名として使用することはできる?
はい、MySQLのテーブルでは「year」をカラム名として使用できます。「year」はMySQLの予約語ではないため、特別なエスケープ処理を行わなくても問題なく利用できます。 テーブルの作成 まず、テーブルを作成してみましょう。 mysql> create table DemoTable ( Year int ); Query OK, 0 rows affected (0.87 sec) レコードの挿入 insertコマンドを使用して、テーブルにいくつかのレコードを挿入します。 mysql> insert into DemoTable values(1995); Query