長さの違う文字列を意図した順番にソートする - 長さの違う文字列の自然なソート - SQL Server
長さの違う文字列を単純にソートすると自然な並びにならないことがあります。
例
元データ
元データとして以下のファイルがあるとします。
ID | FileName |
1 | 1.bmp |
2 | 2.bmp |
3 | 3.bmp |
4 | 4.bmp |
5 | 11.bmp |
6 | 12.bmp |
7 | 13.bmp |
8 | 14.bmp |
9 | 101.bmp |
10 | 102.bmp |
11 | 103.bmp |
12 | 104.bmp |
があります。
エクスプローラで表示した場合
エクスプローラで表示した場合は
順番 | FileName |
1 | 1.bmp |
2 | 2.bmp |
3 | 3.bmp |
4 | 4.bmp |
5 | 11.bmp |
6 | 12.bmp |
7 | 13.bmp |
8 | 14.bmp |
9 | 101.bmp |
10 | 102.bmp |
11 | 103.bmp |
12 | 104.bmp |
の順番で表示されます。特に問題はなく自然な順番です。
SQL で並び替えをした場合
上記の情報をデータベース(bmpTable テーブル)に挿入し
select * from bmpTable order by FileName
のクエリを実行した場合、返される結果の順は以下となります。
順番 | FileName |
1 | 1.bmp |
2 | 101.bmp |
3 | 102.bmp |
4 | 103.bmp |
5 | 104.bmp |
6 | 11.bmp |
7 | 12.bmp |
8 | 13.bmp |
9 | 14.bmp |
10 | 2.bmp |
11 | 3.bmp |
12 | 4.bmp |
文字の比較が最初の文字から実行されるため、自然な順番ではない結果となります。
対策
まず文字列の長さ順にソートしたのちに文字列比較をしてソートすることで自然な順番で結果を返すことができます。
コード例 (SQL Server)
select * from bmpTable order by LEN(FileName), FileName
結果
文字列の長さ順にソートした後に文字列同士の比較をするため自然な並びになります。
順番 | FileName |
1 | 1.bmp |
2 | 2.bmp |
3 | 3.bmp |
4 | 4.bmp |
5 | 11.bmp |
6 | 12.bmp |
7 | 13.bmp |
8 | 14.bmp |
9 | 101.bmp |
10 | 102.bmp |
11 | 103.bmp |
12 | 104.bmp |
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。