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

【MySQL】「CSE 15」「CSE 11」のような文字列レコードを数値順に並べ替える方法

はじめに

MySQLでは、「CSE 101」や「CSE 11」のように接頭辞と数字が組み合わさった文字列データを、そのまま並べ替えると意図しない順序になってしまうことがあります。本記事では、文字列から数値部分を抽出し、CAST関数を使って数値として正しくソートする方法を具体例とともに解説します。

テーブルの作成

まず、サンプル用のテーブルを作成しましょう。

mysql> create table DemoTable1969
(
BranchCode varchar(20)
);
Query OK, 0 rows affected (0.00 sec)

レコードの挿入

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

mysql> insert into DemoTable1969 values('CSE 101');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1969 values('CSE 11');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1969 values('CSE 15');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1969 values('CSE 6');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1969 values('CSE 201');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1969 values('CSE 110');
Query OK, 1 row affected (0.00 sec)

登録データの確認

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

mysql> select * from DemoTable1969;

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

+------------+
| BranchCode |
+------------+
| CSE 101 |
| CSE 11 |
| CSE 15 |
| CSE 6 |
| CSE 201 |
| CSE 110 |
+------------+
6 rows in set (0.00 sec)

このままでは挿入した順序で表示されており、数値の大小順にはなっていません。

数値として並べ替えるクエリ

文字列レコードから数値部分を取り出して降順にソートするには、LOCATE()で空白の位置を特定し、SUBSTRING()で数値部分だけを切り出したうえで、CAST()により符号付き整数(SIGNED)へ変換します。以下がそのクエリです。

mysql> select * from DemoTable1969
order by CAST(SUBSTRING(BranchCode,LOCATE(' ',BranchCode)+1) AS SIGNED) DESC;

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

+------------+
| BranchCode |
+------------+
| CSE 201 |
| CSE 110 |
| CSE 101 |
| CSE 15 |
| CSE 11 |
| CSE 6 |
+------------+
6 rows in set (0.00 sec)

数字の大小に基づいた正しい順序(201 → 110 → 101 → 15 → 11 → 6)で表示されていることが確認できます。

クエリのポイント解説

LOCATE(' ', BranchCode):文字列内の最初の半角スペースの位置を返します。
SUBSTRING(BranchCode, LOCATE(' ',BranchCode)+1):スペースの次の文字以降、つまり数値部分のみを抽出します。
CAST(... AS SIGNED):抽出した文字列を符号付き整数に変換することで、「11」と「110」のような文字列比較による誤った順序を防ぎます。
なお、昇順に並べたい場合は、クエリ末尾のDESCをASCに変更するだけで対応できます。

  1. MySQLのREGEXPで特定の数値で始まる文字列+数値のレコードを取得する方法

    REGEXPを使った特定の数値で始まるレコードの取得方法MySQLでは、REGEXP演算子(正規表現)を使用することで、特定の数値で始まる文字列と数値が混在したレコードを簡単に抽出できます。基本的な構文は以下の通りです。Select yourColumnName1,yourColumnName2 from yourTableName where yourColumnName2 REGEXP ^yourStringValue[yourNumericValue];サンプルテーブルの作成まずは動作確認のためのテーブルを作成しましょう。mysql> create table demo45 -&g

  2. Pythonの正規表現を使って文字列から最大の数値を抽出する方法

    はじめにPythonの正規表現(regex)を使って文字列から最大の数値を抽出する最も簡単な方法は、以下の2ステップです。reモジュールを使って、文字列内のすべての数値を抽出する抽出した数値の中から最大値を見つける具体例たとえば、次のような入力文字列があるとします。「この都市には121005人が住んでおり、隣の都市には1587469人、遠く離れた都市には18775994人が住んでいます。」この文字列から得られるべき出力は次のとおりです。18775994正規表現「\d+」の使い方文字列内のすべての数値を検索するには、「\d+」という正規表現パターンを使用します。「\d」は1桁の数字(digit)