【MySQLなるほど】「ORDER BY」で文字列を数値扱いして並べ替える方法
MySQL で文字列を数値として昇順に並べ替える方法
MySQL では、文字列を含む列を数値として昇順に並べ替えることが必要になる場合があります。しかし、デフォルトの並べ替えでは、文字列が文字コード順に並べ替えられてしまうため、意図した結果が得られないことがあります。
解決策
この問題を解決するには、以下の2つの方法があります。
方法1:CAST 関数を使用する
CAST 関数は、値を別のデータ型に変換するために使用できます。この場合、文字列を数値に変換するために使用することができます。
SELECT * FROM your_table
ORDER BY CAST(your_column AS SIGNED);
このクエリは、your_column
列の値を符号付き整数に変換し、その結果に基づいて行を昇順に並べ替えます。
方法2:SUBSTRING_INDEX 関数と LENGTH 関数を使用する
SUBSTRING_INDEX 関数は、文字列の一部を抽出するために使用できます。LENGTH 関数は、文字列の長さを取得するために使用できます。この2つの関数を使用して、文字列の先頭から数値部分だけを抽出することができます。
SELECT * FROM your_table
ORDER BY SUBSTRING_INDEX(your_column, '.', 1) * 1;
このクエリは、your_column
列の値から最初のドットまでの部分だけを抽出します。その後、その結果に1を乗算して数値に変換し、その結果に基づいて行を昇順に並べ替えます。
例
以下の例では、company_code
列に "C1", "C10", "C100", "C12", "C13" のような文字列が含まれている company
テーブルがあると仮定します。
方法1
SELECT company_code FROM company
ORDER BY CAST(company_code AS SIGNED);
このクエリは次の結果を返します。
C1
C10
C12
C13
C100
SELECT company_code FROM company
ORDER BY SUBSTRING_INDEX(company_code, '.', 1) * 1;
C1
C10
C12
C13
C100
補足
- 上記の例では、符号付き整数を使用していますが、必要に応じて無符号整数を使用することもできます。
- 文字列が小数を含む場合は、適切なデータ型と変換関数を使用する必要があります。
- 上記の方法は、MySQL 5.7以降で使用できます。それ以前のバージョンの MySQL では、別の方法を使用する必要がある場合があります。
上記以外にも、ORDER BY
句で使用できるさまざまな関数があります。詳細については、MySQL のドキュメントを参照してください。
-- テーブル定義
CREATE TABLE company (
company_id INT PRIMARY KEY AUTO_INCREMENT,
company_code VARCHAR(255) NOT NULL
);
-- データ挿入
INSERT INTO company (company_code) VALUES
('C100'),
('C12'),
('C1'),
('C13'),
('C10');
-- 方法1:CAST 関数を使用する
SELECT company_code FROM company
ORDER BY CAST(company_code AS SIGNED);
-- 方法2:SUBSTRING_INDEX 関数と LENGTH 関数を使用する
SELECT company_code FROM company
ORDER BY SUBSTRING_INDEX(company_code, '.', 1) * 1;
説明
このコードは、以下の内容を実行します。
company
テーブルを作成します。このテーブルには、company_id
列とcompany_code
列があります。company_id
列はプライマリ キーであり、自動的にインクリメントされます。company_code
列は、会社コードを格納します。company
テーブルにデータ挿入します。挿入されるデータは、"C100", "C12", "C1", "C13", "C10" のような文字列を含むcompany_code
列です。- 2つの方法で
company_code
列を昇順に並べ替えます。
- 方法1:
CAST
関数を使用して、company_code
列の値を符号付き整数に変換します。その後、その結果に基づいて行を昇順に並べ替えます。
結果
このコードを実行すると、次の結果が出力されます。
C1
C10
C12
C13
C100
MySQL で文字列を数値として昇順に並べ替えるその他の方法
PAD 関数を使用する
PAD 関数は、文字列を空白で埋めるために使用できます。この機能を使用して、company_code
列の値を固定長に揃えることができます。その後、LPAD
関数を使用して、文字列の先頭に0を追加することができます。これにより、文字列が数値として比較可能になります。
SELECT * FROM company
ORDER BY CAST(LPAD(PAD(company_code, 5, '0'), 5, ' ') AS SIGNED);
REPEAT 関数は、文字列を指定した回数繰り返すために使用できます。この機能を使用して、company_code
列の値の先頭に0を必要な数だけ追加することができます。これにより、文字列が数値として比較可能になります。
SELECT * FROM company
ORDER BY CAST(REPEAT('0', LENGTH(company_code) - 1) * company_code AS SIGNED);
正規表現を使用して、company_code
列の値から数字の部分だけを抽出することができます。その後、その結果を数値に変換して、その結果に基づいて行を昇順に並べ替えることができます。
SELECT * FROM company
ORDER BY CAST(SUBSTRING(company_code, REGEXP_REPLACE(company_code, '[^0-9]', ''), 1) AS SIGNED);
SQL Server または PostgreSQL などの他のデータベースを使用する
MySQL 以外のデータベースを使用している場合は、そのデータベースに用意されている文字列を数値として並べ替えるための組み込み関数を使用できる場合があります。
以下の例では、company
テーブルの company_code
列を数値として昇順に並べ替える方法を 3 つの方法で示しています。
SELECT company_code FROM company
ORDER BY CAST(LPAD(PAD(company_code, 5, '0'), 5, ' ') AS SIGNED);
SELECT company_code FROM company
ORDER BY CAST(REPEAT('0', LENGTH(company_code) - 1) * company_code AS SIGNED);
方法3:正規表現を使用する
SELECT company_code FROM company
ORDER BY CAST(SUBSTRING(company_code, REGEXP_REPLACE(company_code, '[^0-9]', ''), 1) AS SIGNED);
いずれの方法を使用しても、次の結果が出力されます。
C1
C10
C12
C13
C100
- 上記の方法は、あくまでも例であり、状況に応じて最適な方法を選択する必要があります。
- 複雑なクエリを使用する場合は、パフォーマンスを向上させるためにクエリを最適化する必要がある場合があります。
mysql sql string