我有类似的可怕情况,并开发了一个合适的可怕功能来处理它(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
写完之后我想朝自己的脸开枪,但是它可以工作并且在运行时似乎不会杀死服务器。