長さの違う文字列を意図した順番にソートする - 長さの違う文字列の自然なソート - SQL Server

長さの違う文字列を単純にソートすると自然な並びにならないことがあります。

元データ

元データとして以下のファイルがあるとします。
IDFileName
11.bmp
22.bmp
33.bmp
44.bmp
511.bmp
612.bmp
713.bmp
814.bmp
9101.bmp
10102.bmp
11103.bmp
12104.bmp
があります。

エクスプローラで表示した場合

エクスプローラで表示した場合は
順番FileName
11.bmp
22.bmp
33.bmp
44.bmp
511.bmp
612.bmp
713.bmp
814.bmp
9101.bmp
10102.bmp
11103.bmp
12104.bmp
の順番で表示されます。特に問題はなく自然な順番です。

SQL で並び替えをした場合

上記の情報をデータベース(bmpTable テーブル)に挿入し
select * from bmpTable order by FileName
のクエリを実行した場合、返される結果の順は以下となります。
順番FileName
11.bmp
2101.bmp
3102.bmp
4103.bmp
5104.bmp
611.bmp
712.bmp
813.bmp
914.bmp
102.bmp
113.bmp
124.bmp
文字の比較が最初の文字から実行されるため、自然な順番ではない結果となります。

対策

まず文字列の長さ順にソートしたのちに文字列比較をしてソートすることで自然な順番で結果を返すことができます。

コード例 (SQL Server)

select * from bmpTable order by LEN(FileName), FileName

結果

文字列の長さ順にソートした後に文字列同士の比較をするため自然な並びになります。

順番FileName
11.bmp
22.bmp
33.bmp
44.bmp
511.bmp
612.bmp
713.bmp
814.bmp
9101.bmp
10102.bmp
11103.bmp
12104.bmp
著者
iPentec.com の代表。ハードウェア、サーバー投資、管理などを担当。
Office 365やデータベースの記事なども担当。
掲載日: 2012-12-29
iPentec all rights reserverd.