私は同様の恐ろしい状況にあり、それに対処するために適切に恐ろしい機能を開発しました(SQLServer)
私の状況では、「単位」の表があります (これは学生のための作業追跡システムであるため、このコンテキストでの単位は学生が行っているコースを表します)。ユニットにはコードがあり、ほとんどの場合純粋な数値ですが、さまざまな理由で varchar になり、最大 5 文字のプレフィックスを付けることを決定しました。したがって、53,123,237,356 が正常にソートされることを期待していますが、T53、T123、T237、T356 もソートされると予想されます。
UnitCode は nvarchar(30) です
関数の本体は次のとおりです。
declare @sortkey nvarchar(30)
select @sortkey =
case
when @unitcode like '[^0-9][0-9]%' then left(@unitcode,1) + left('000000000000000000000000000000',30-(len(@unitcode))) + right(@unitcode,len(@unitcode)-1)
when @unitcode like '[^0-9][^0-9][0-9]%' then left(@unitcode,2) + left('000000000000000000000000000000',30-(len(@unitcode))) + right(@unitcode,len(@unitcode)-2)
when @unitcode like '[^0-9][^0-9][^0-9][0-9]%' then left(@unitcode,3) + left('000000000000000000000000000000',30-(len(@unitcode))) + right(@unitcode,len(@unitcode)-3)
when @unitcode like '[^0-9][^0-9][^0-9][^0-9][0-9]%' then left(@unitcode,4) + left('000000000000000000000000000000',30-(len(@unitcode))) + right(@unitcode,len(@unitcode)-4)
when @unitcode like '[^0-9][^0-9][^0-9][^0-9][^0-9][0-9]%' then left(@unitcode,5) + left('000000000000000000000000000000',30-(len(@unitcode))) + right(@unitcode,len(@unitcode)-5)
when @unitcode like '%[^0-9]%' then @unitcode
else left('000000000000000000000000000000',30-len(@unitcode)) + @unitcode
end
return @sortkey
それを書いた後、私は自分の顔を撃ちたかったのですが、それは機能し、実行時にサーバーを殺さないようです.