假设我们在给定的行中有一个12位数的数字。
AccountNumber
=============
136854775807
293910210121
763781239182是否有可能仅仅根据一行的数目来调整单个行的编号?136854775807会变成573145887067
发布于 2017-09-12 13:14:44
我已经创建了一个用户定义的函数来洗牌数字。
我所做的是,取出每个字符,并将其与一个随机数一起存储在一个表变量中。最后,将每个字符按随机数的升序串联起来。
在用户定义的函数中使用RAND函数是不可能的.所以创建了一个VIEW来获取一个随机数。
视图: random_num
create view dbo.[random_num]
as
select floor(rand()* 12) as [rnd];随机数不一定在0到12之间,我们可以给出一个更大的数,而不是12。
用户定义函数: fn_shuffle
create function dbo.[fn_shuffle](
@acc varchar(12)
)
returns varchar(12)
as begin
declare @tbl as table([a] varchar(1), [b] int);
declare @i as int = 1;
declare @l as int;
set @l = (select len(@acc));
while(@i <= @l)
begin
insert into @tbl([a], [b])
select substring(@acc, @i, 1), [rnd] from [random_num]
set @i += 1;
end
declare @res as varchar(12);
select @res = stuff((
select '' + [a]
from @tbl
order by [b], [a]
for xml path('')
)
, 1, 0, ''
);
return @res;
end然后,您就可以像下面这样使用这个函数。
select [acc_no],
dbo.[fn_shuffle]([acc_no]) as [shuffled]
from dbo.[your_table_name];在这里找到一个演示
发布于 2017-09-12 13:49:32
我看不出有什么用处,但你可以。有一种方法:
select t.accountnumber, x.shuffled
from t cross apply
(select digit
from (values (substring(accountnumber, 1, 1)),
substring(accountnumber, 2, 1)),
. . .
substring(accountnumber, 12, 1))
)
) v(digit)
order by newid()
for xml path ('')
) x(shuffled);https://stackoverflow.com/questions/46176912
复制相似问题