SELECT * FROM sample
ORDER BY ID
結果 (SQL Server 2005 検証環境)
| ID |
|---|
| 1 |
| 2 |
| 20 |
| 2A |
| 3 |
| 3123 |
| 4 |
| A1 |
| AA1 |
2、の次に20、3と続いてる。これでは適切なソートとはいい難い。
そこで、先ほどのSQL文に一工夫。
SELECT * FROM sample
ORDER BY
CASE WHEN ISNUMERIC(ID) = 1 THEN
REPLICATE('0', 10 - LEN(ID)) + ID
ELSE
ID
END
結果 (SQL Server 2005 検証環境)
| ID |
|---|
| 1 |
| 2 |
| 3 |
| 4 |
| 20 |
| 3123 |
| 2A |
| A1 |
| AA1 |
と、思った通りにソートされました。めでたしめでたし。
最後に今回使用した関数を簡単に説明します。
ISNUMERIC(): 引数の値を数値に変換可能かを返します。
1:数値変換可能 0:それ以外
REPLICATE(,): 文字を指定された回数繰り返します。
第1引数に繰り返したい文字、第2引数に繰り返し回数を指定します。