最も簡単な解決策は、先頭にゼロを追加することです
Select ...From TableOrder By Right( '0000000000' + YourColumn, 10)
プレ>ただし、これは英字を考慮しません。英字を扱うには、潜在的な英字がいくつあるかを知る必要があります。ある場合は、次のようにすることができます:
Select ...From #TestOrder By Case When IsNumeric(NumVal) =1 Then Right('0000000000' + NumVal + '0', 10) Else Right('0000000000' + NumVal, 10) Endコード> プレ>
追加
テスト実行:
object_id('tempdb..#Test') が null でない場合 テーブルをドロップ #Testテーブルを作成 #Test ( NumVal varchar(10) )Insert #Test(NumVal) Values('02')Insert #Test( NumVal) Values('03')Insert #Test(NumVal) Values('1a')Insert #Test(NumVal) Values('1b')Insert #Test(NumVal) Values('10')Insert #Test(NumVal) Values('11')Select NumValFrom #TestOrder When IsNumeric(NumVal) =1 Then Right('0000000000' + NumVal + '0', 10) Else Right('0000000000' + NumVal, 10) EndResults:1a1b02031011コード> プレ>
私の解決策についてのメモ。アルファベット文字に特別な意味がある場合は、Erick Robertson が提案したように、データを別々の列に分割する必要があります。上記のソリューションは、非常に特殊な 2 つのケースのみを処理します。すべてが数値である場合と、末尾に 1 つの英字がある場合です。データに複数のアルファベット文字が含まれている可能性がある場合、またはアルファベット文字が値の末尾以外に配置される場合がある場合、私のソリューションは機能しません。さらに、私のソリューションでは、テーブル スキャンで各値の順序付け可能な文字列が評価されることに注意してください。
あなたが求めているのが1回限りの迅速な解決策である場合、私のアプローチはうまくいきます.長期的な解決策を探している場合は、データを別々の列に分割するか、間抜けな並べ替え順序を受け入れるか、各値の相対的な並べ替え順序を指定する列を追加してください。