長さの違う文字列を単純にソートすると自然な並びにならないことがあります。
元データとして以下のファイルがあるとします。
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 |