关于N进制数据计算SQL原生处理

本文是因为看了这个帖子有感而发

http://bbs.csdn.net/topics/392295261

楼主要求:获取34进制的流水码的函数或者存储过程,0..9  A..Z 去掉IO,一共四位,每次调用增加1.

这个帖子激起了我兴趣,下面提供一个泛化的处理方式,所谓泛化指进制数任意,进制中的符号任意,函数如下:

if Object_id('NInc')is not null
drop function NInc
go
--@NCode进制码表,例如:我们熟悉的16进制为"0123456789ABCDEF",也可以自定义特殊的进制,例如三进制"ABC",这样计算就会有A+1=B,B+1=C,C+1=BA,是不是很神奇?
--@NNum 表示参与运算的N进制数 ,@Num参与运算的10十进制数
create function NInc(@NCode varchar(100),@NNum varchar(10),@Num int)
returns varchar(10)
as
BEGIN
declare  @N int,@i int,@idx int,@str varchar(20)
--N进制转十进制,同时+@Num
  select @N=len(@NCode),@i=0,@NNum=reverse(@NNum)
  while @i<len(@NNum)
  begin
    set @idx=charindex(substring(@NNum,@i+1,1),@NCode)-1
    set @Num=@Num+ @idx*power(@N,@i)
    set @i=@i+1
  end
	set @str=''
--十进制转N进制	  
	while @Num<>0
	begin
		select @str=substring(@NCode,(@Num % @n)+1,1)+@str
		set @Num=@Num/@N
  end

	if @Num=0 and @str=''
	  set @str=Left(@NCode,1)
	  
	return @str 
END
go

测试:

select A=dbo.Ninc('0123456789ABCDEF','F',1),B=dbo.Ninc('0123456789ABCDEF','1B',1)

返回

A          B         
---------- ----------
10         1C

是我们需要的结果

再试一下特殊码表的运算:

select c1=dbo.Ninc('abc','a',1),c2=dbo.NInc('abc','c',1),c3=dbo.NInc('abc','c',2)

返回

c1         c2         c3        
---------- ---------- ----------
b          ba         bb

完美实现基于abc符号的三进制运算




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值