sql [33进数→10进数変换]误読しやすいILOを除くA〜Zと数字で采番

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql [33进数→10进数変换]误読しやすいILOを除くA〜Zと数字で采番相关的知识,希望对你有一定的参考价值。

/* ********************************************

 33進数(※)の文字列を10進数の数値に変換
 ※33進数 = 0123456789ABCDEFGHJKMNPQRSTUVWXYZ
            (誤読しやすい'I','L','O'を除く)

******************************************** */

CREATE FUNCTION [dbo].[fn33DecToDec](
	@NUMSTR NVARCHAR(10)
) RETURNS DECIMAL(14, 0)
AS
BEGIN
	DECLARE
		@DecLength  INT = 33,    -- ASCII('Z') - ASCII('A') + 1 - 3 + 10,
		@OffsetNum0 INT = 48,    -- ASCII('0'),
		@OffsetNum1 INT = 55,    -- ASCII('A') - 10,
		@OffsetNum  INT

	DECLARE
		@CUR_CHAR   NCHAR(1),           -- 変換対象文字
		@LEN_NUMSTR INT = LEN(@NUMSTR), -- 変換元文字列の長さ
		@RETVAL     DECIMAL(14, 0) = 0, -- 自動採番結果
		@R_CNT      INT

	SET @R_CNT = @LEN_NUMSTR

	WHILE (@R_CNT > 0)
	BEGIN
		SET @CUR_CHAR = SUBSTRING(@NUMSTR, ABS(@R_CNT - @LEN_NUMSTR) + 1, 1)

		SET @OffsetNum = CASE
			WHEN @CUR_CHAR <  N'A' THEN @OffsetNum0
			WHEN @CUR_CHAR <  N'I' THEN @OffsetNum1
			WHEN @CUR_CHAR <  N'L' THEN @OffsetNum1 + 1
			WHEN @CUR_CHAR <  N'O' THEN @OffsetNum1 + 2
			WHEN @CUR_CHAR <= N'Z' THEN @OffsetNum1 + 3
			ELSE @OffsetNum0
		END

		SET @RETVAL = @RETVAL + (POWER(CONVERT(DECIMAL(14, 0), @DecLength), @R_CNT - 1) * (ASCII(@CUR_CHAR) - @OffsetNum))

		SET @R_CNT = @R_CNT - 1
	END

	RETURN @RETVAL
END
GO

以上是关于sql [33进数→10进数変换]误読しやすいILOを除くA〜Zと数字で采番的主要内容,如果未能解决你的问题,请参考以下文章

csharp 10进数から16进数へ

csharp 10进数から2进数へ

csharp アクセス竞合が起きやすいファイルを开く。

51nod1413 权势二进数

python 任何()を使った少しトリッキーな判定方法※见やすいが,短络评価(短路评价)しないので遅い

日本語学習 刺身