SQL脚本函数 34进制转换为10进制
一个SQL脚本函数,34进制转换为10进制。36进制指以0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、J、K、L、M、N、P、Q、R、S、T、U、V、W、X、Y、Z为基数做累加。 ### SQL脚本函数:34进制转换为10进制 #### 背景介绍 在计算机科学领域,不同的进制系统被广泛应用于数据表示和处理中。常见的进制有二进制(2进制)、八进制(8进制)、十进制(10进制)和十六进制(16进制)。而在某些特殊应用场景下,也会使用到非常规进制,如本例中的34进制。 #### 34进制定义 34进制是一种非常规的进位计数系统,其基数为34,因此使用0至9的数字以及A至Z的字母(除去I和O,避免与1和0混淆),总共34个符号来表示数值。具体符号包括:0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F、G、H、J、K、L、M、N、P、Q、R、S、T、U、V、W、X、Y、Z。 #### SQL脚本函数实现 为了实现从34进制到10进制的转换,我们可以编写一个SQL函数,该函数接收一个字符串作为输入,并返回相应的十进制整数值。下面是对给定代码片段的详细分析: ```sql /*34ת10*/ CREATE FUNCTION [dbo].[fn_34ToInt](@s varchar(16)) RETURNS INT AS BEGIN DECLARE @DECMDL varchar(40) -- 映射表 DECLARE @i int, @result INT SET @DECMDL = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ' -- 映射表,用于将34进制字符映射到其对应的值 WHILE @i < LEN(@s) BEGIN IF SUBSTRING(@s, @i + 1, 1) NOT BETWEEN '0' AND '9' AND SUBSTRING(@s, @i + 1, 1) NOT BETWEEN 'A' AND 'Z' BEGIN SELECT @result = 0 -- 如果遇到非法字符,则结果设为0 BREAK END SELECT @result = @result + (CHARINDEX(SUBSTRING(@s, @i + 1, 1), @DECMDL) - 1) * CAST(POWER(34, @i) AS INT), @i = @i + 1 END RETURN @result END ``` #### 函数详解 1. **函数声明**: - `CREATE FUNCTION [dbo].[fn_34ToInt](@s varchar(16))`:定义了一个名为`fn_34ToInt`的函数,接受一个长度不超过16的字符串参数`s`。 2. **局部变量声明**: - `DECLARE @DECMDL varchar(40)`:声明一个变量`@DECMDL`用于存储34进制的映射表。 - `DECLARE @i int, @result INT`:声明两个整型变量`@i`用于循环控制,`@result`用于累积计算结果。 3. **初始化映射表**: - `SET @DECMDL = '0123456789ABCDEFGHJKLMNPQRSTUVWXYZ'`:设置映射表,确保每个34进制字符与其对应的十进制数值相匹配。 4. **遍历并转换**: - `WHILE @i < LEN(@s)`:循环遍历输入字符串`s`的每一个字符。 - `IF SUBSTRING(@s, @i + 1, 1) NOT BETWEEN '0' AND '9' AND SUBSTRING(@s, @i + 1, 1) NOT BETWEEN 'A' AND 'Z'`:检查当前字符是否属于34进制的有效范围,如果不是,则将结果置为0并退出循环。 - `SELECT @result = @result + (CHARINDEX(SUBSTRING(@s, @i + 1, 1), @DECMDL) - 1) * CAST(POWER(34, @i) AS INT), @i = @i + 1`:计算当前字符对应的十进制值,并将其累加到结果中。 5. **返回结果**: - `RETURN @result`:返回最终的十进制数值。 #### 总结 通过上述步骤,我们成功实现了从34进制到10进制的转换。此函数可以广泛应用于需要处理非标准进制数据的场景中,例如在密码学、编码等领域有着潜在的应用价值。此外,该函数的实现逻辑清晰明了,便于理解和维护。
CREATE FUNCTION [dbo].[fn_34ToInt](@s varchar(16))
RETURNS INT
AS
BEGIN
-- DECLARE @S VARCHAR(16)
DECLARE @DECMDL VARCHAR(40) --使用的字符基数
DECLARE @i int,@result INT
-- SET @S='5W'
SELECT @i=0,@result=0,@s=RTRIM(LTRIM(UPPER(REVERSE(@s))))
SET @DECMDL='0123456789ABCDEFGHJKLMNPQRSTUVWXYZ'
WHILE @i<LEN(@s)
BEGIN
IF SUBSTRING(@s,@i+1,1) not between '0' and '9' and SUBSTRING(@s,@i+1,1) not between 'A' and 'Z'
BEGIN
SELECT @result=0
break
END
SELECT @result=@result+(CHARINDEX(SUBSTRING(@s,@i+1,1),@DECMDL)-1)*cast(POWER(34,@i) as int),@i=@i+1
END
-- PRINT @RESULT
RETURN @result
- 粉丝: 14
- 资源: 118
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
- 1
- 2
前往页