假设我们在给定行中有一个12位数字。
AccountNumber
=============
136854775807
293910210121
763781239182
是否可以仅根据该行的数量来改变单行的数量?例如136854775807将成为573145887067
答案 0 :(得分:1)
我创建了一个用户定义的函数来对数字进行随机播放。
我所做的是,取出每个字符并将其与随机数一起存储到表变量中。然后最后以随机数的升序连接每个字符。
无法在用户定义的函数中使用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];
<强> Find a demo here 强>
答案 1 :(得分:0)
我真的没有看到实用程序,但你可以。这是一种方式:
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);