MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで長さの異なる英数字データを正しく並べ替える方法

MySQLでは、STU-MIT-143 のような英数字の文字列を単純に ORDER BY で並べ替えると、辞書順(文字コード順)になってしまい、意図した数値順にならないことがあります。本記事では、SUBSTRING_INDEX() 関数を活用して、長さの異なる英数字データを正しくソートする方法を解説します。

サンプルテーブルの作成

まず、以下のコマンドでテーブルを作成します。

mysql> create table DemoTable1623
    -> (
    -> StudentCode varchar(20)
    -> );
Query OK, 0 rows affected (0.47 sec)

レコードの挿入

INSERT文を使って、テーブルにいくつかのレコードを挿入します。

mysql> insert into DemoTable1623 values('STU-MIT-143');
Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable1623 values('STU-MIT-10');
Query OK, 1 row affected (0.14 sec)
mysql> insert into DemoTable1623 values('STU-MIT-150');
Query OK, 1 row affected (0.21 sec)
mysql> insert into DemoTable1623 values('STU-MIT-148');
Query OK, 1 row affected (0.22 sec)

登録データの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1623;

実行結果は以下のとおりです。

+-------------+
| StudentCode |
+-------------+
| STU-MIT-143 |
| STU-MIT-10  |
| STU-MIT-150 |
| STU-MIT-148 |
+-------------+
4 rows in set (0.00 sec)

このまま ORDER BY StudentCode とすると、文字列として比較されるため、STU-MIT-10 が先頭に来ず、期待どおりの順序になりません。

英数字カラムを正しく並べ替えるクエリ

そこで、区切り文字を基準に分割して並べ替えるのが有効です。以下がそのクエリです。

mysql> select * from DemoTable1623
    -> order by substring_index(StudentCode, '-', 1),
    -> substring_index(StudentCode, '-', -1) + 0;

実行結果は以下のとおりです。

+-------------+
| StudentCode |
+-------------+
| STU-MIT-10  |
| STU-MIT-143 |
| STU-MIT-148 |
| STU-MIT-150 |
+-------------+
4 rows in set (0.00 sec)

ポイント解説

このクエリのポイントは次の2点です。

  • substring_index(StudentCode, '-', 1):区切り文字「-」より前の部分(プレフィックス)で並べ替えます。
  • substring_index(StudentCode, '-', -1) + 0:「-」より後ろの数値部分を取り出し、「+ 0」によって数値として評価することで、10143 のように桁数が異なる数字でも正しい数値順に並びます。

このように SUBSTRING_INDEX() 関数と数値変換を組み合わせることで、長さの異なる英数字データでも自然な順序でソートできます。学生コードや商品コードなど、プレフィックス+連番形式のデータを扱う際にぜひ活用してください。

  1. JavaでResultSetから列名を取得する方法!MySQLを使ったgetMetaData()の実装例を解説

    ResultSetから列名を取得するには?getMetaData()メソッドの基本JavaでJDBCを使ってデータベース操作を行っていると、「検索結果(ResultSet)に含まれる列名(カラム名)を動的に知りたい」という場面によく出会います。そんなときに活躍するのが、getMetaData()メソッドです。このメソッドを呼び出すと、結果セットの構造情報(列の数や名前、型など)を持つResultSetMetaDataオブジェクトを取得できます。プロトタイプ宣言は以下のとおりです。ResultSetMetaData getMetaData() throws SQLException;サンプル用テ

  2. MySQLで特定のカラム名を持つテーブルを検索する方法

    MySQLで特定のカラム名(列名)を持つテーブルを探したい場合は、システムビューである information_schema.columns を利用します。このビューにはデータベース内のすべてのテーブルとカラムの情報が格納されているため、条件を指定して検索するだけで、目的のカラムを持つテーブルを簡単に特定できます。 基本構文 カラム名からテーブル名を検索する際の基本的な構文は以下の通りです。 select distinct table_name from information_schema.columns where column_name like %yourSearchValue% a