MySQLで文字列型の数値を正しくソートする方法(CAST関数の使い方)
MySQLで文字列の数値をソートするには?
MySQLでは、VARCHAR型など文字列として保存された数値をそのままORDER BYで並べ替えると、辞書順にソートされてしまい、意図した数値順になりません。このような場合には、CAST()関数を使って文字列を数値型に変換してからソートします。
基本構文
SELECT * FROM テーブル名 ORDER BY CAST(カラム名 AS DECIMAL(整数部の桁数, 小数点以下の桁数)) DESC;
DECIMAL(M, D)の「M」は全体の桁数、「D」は小数点以下の桁数を指定します。
サンプルテーブルの作成
実際に動作を確認するため、まずテーブルを作成してみましょう。以下のクエリを実行します。
mysql> CREATE TABLE SortingStringDemo -> ( -> Amount VARCHAR(10) -> ); Query OK, 0 rows affected (0.91 sec)
ここでは金額を表すAmountカラムをVARCHAR型(文字列型)として定義しています。
テストデータの挿入
INSERTコマンドでいくつかレコードを挿入します。
mysql> INSERT INTO SortingStringDemo VALUES('12.34');
Query OK, 1 row affected (0.21 sec)
mysql> INSERT INTO SortingStringDemo VALUES('124.50');
Query OK, 1 row affected (0.56 sec)
mysql> INSERT INTO SortingStringDemo VALUES('9.59');
Query OK, 1 row affected (0.20 sec)
mysql> INSERT INTO SortingStringDemo VALUES('150.68');
Query OK, 1 row affected (0.17 sec)
mysql> INSERT INTO SortingStringDemo VALUES('600.54');
Query OK, 1 row affected (0.11 sec)
登録データの確認
SELECT文ですべてのレコードを表示してみます。
mysql> SELECT * FROM SortingStringDemo;
実行結果は以下のとおりです。
+--------+ | Amount | +--------+ | 12.34 | | 124.50 | | 9.59 | | 150.68 | | 600.54 | +--------+ 5 rows in set (0.00 sec)
CAST()を使った降順ソート
それでは、文字列の数値を降順(大きい順)にソートしてみましょう。以下のクエリを実行します。
mysql> SELECT * FROM SortingStringDemo ORDER BY CAST(Amount AS DECIMAL(6,2)) DESC;
実行結果は以下のとおりです。
+--------+ | Amount | +--------+ | 600.54 | | 150.68 | | 124.50 | | 12.34 | | 9.59 | +--------+ 5 rows in set (0.00 sec)
文字列のままORDER BYすると「9.59」が先頭に来てしまうところですが、CAST()でDECIMAL型に変換することで、正しく数値順(600.54 → 150.68 → 124.50 → 12.34 → 9.59)に並び替えられました。
補足:CAST以外の方法
同様の結果は、暗黙的な型変換を利用したORDER BY Amount + 0でも得られますが、可読性と明示性の観点からはCAST()やCONVERT()を使用する方法が推奨されます。また、数値としてのみ扱うカラムであれば、最初からDECIMAL型でカラムを定義しておくのがベストプラクティスです。
-
文字列の長さに応じて星(*)を追加するMySQLクエリの書き方
文字列の長さに応じて星(*)を追加したい場合、MySQLのRPAD()関数を使用すると簡単に実現できます。RPAD()は、指定した長さになるまで文字列の右側を任意の文字で埋める関数です。ここでは、文字列の長さが5文字以上の場合は合計10文字まで、5文字未満の場合は7文字まで星で埋める例を紹介します。テーブルの作成まず、サンプル用のテーブルを作成しましょう。mysql> create table DemoTable1626 -> ( -> Name varchar(20) -> );Query OK, 0 rows affected (0.37 sec)
-
MySQLで末尾の文字列に基づいてレコードをソートする方法
MySQLで文字列の末尾部分(例:「-D」や「-Smith」など)に基づいてレコードをソートしたい場合は、CASE式とORDER BY句を組み合わせることで実現できます。ここでは、実際のサンプルコードを使いながら、手順をわかりやすく解説します。 1. サンプルテーブルの作成 まずはデモ用のテーブルを作成します。顧客ID(ClientId)を自動採番の主キーとし、顧客名(ClientName)を格納するシンプルな構造です。 mysql> create table DemoTable -> ( -> ClientId int NOT NULL AUTO_INC