Максим Козленко имеет хорошее решение, а другие приближаются к , открывая его полный потенциал , но затем полностью упускают возможность понять, что вы можете определить любую последовательность символов, и используйте его длину в качестве базы . Вот почему мне нравится эта слегка измененная версия его решения, потому что она может работать для базы 16 или базы 17 и т. Д.
Например, что, если вам нужны буквы и цифры, но мне не нравится, что я выгляжу как 1, а О - как 0. Вы можете определить любую последовательность таким образом. Ниже приведена форма «Base 36», которая пропускает I и O для создания «модифицированной базы 34». Вместо этого прокомментируйте шестнадцатеричную строку, чтобы она стала шестнадцатеричной.
declare @value int = 1234567890
DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result varchar(50)
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue int = @value
SET @result = SUBSTRING(@seq, (@workingValue%@baseSize)+1, 1)
WHILE @workingValue > 0
BEGIN
SET @digit = SUBSTRING(@seq, ((@workingValue/@baseSize)%@baseSize)+1, 1)
SET @workingValue = @workingValue/@baseSize
IF @workingValue <> 0 SET @result = @digit + @result
END
select @value as Value, @baseSize as BaseSize, @result as Result
Значение, BaseSize, Результат
1234567890, 34, T5URAA
Я также переместил значение в рабочее значение, а затем перешел из копии рабочего значения в качестве личного предпочтения.
Ниже приведено дополнительное для обратное преобразование для любой последовательности с основанием, определяемым как длина последовательности.
declare @value varchar(50) = 'T5URAA'
DECLARE @seq varchar(100) = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- modified base 34
--DECLARE @seq varchar(100) = '0123456789ABCDEF' -- hex
DECLARE @result int = 0
DECLARE @digit char(1)
DECLARE @baseSize int = len(@seq)
DECLARE @workingValue varchar(50) = @value
DECLARE @PositionMultiplier int = 1
DECLARE @digitPositionInSequence int = 0
WHILE len(@workingValue) > 0
BEGIN
SET @digit = right(@workingValue,1)
SET @digitPositionInSequence = CHARINDEX(@digit,@seq)
SET @result = @result + ( (@digitPositionInSequence -1) * @PositionMultiplier)
--select @digit, @digitPositionInSequence, @PositionMultiplier, @result
SET @workingValue = left(@workingValue,len(@workingValue)-1)
SET @PositionMultiplier = @PositionMultiplier * @baseSize
END
select @value as Value, @baseSize as BaseSize, @result as Result