長さの違う文字列を単純にソートすると自然な並びにならないことがあります。
元データとして以下のファイルがあるとします。
| 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 |
の順番で表示されます。特に問題はなく自然な順番です。
上記の情報をデータベース(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 |
文字の比較が最初の文字から実行されるため、自然な順番ではない結果となります。
まず文字列の長さ順にソートしたのちに文字列比較をしてソートすることで自然な順番で結果を返すことができます。
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 |