У меня похожая ужасная ситуация, и я разработал подходящую ужасную функцию, чтобы справиться с ней (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
Я хотел выстрелить себе в лицо после того, как написал это, однако он работает и, похоже, не убивает сервер при запуске.