根据行中的数字来改组数字

时间:2017-09-12 12:51:51

标签: sql sql-server

假设我们在给定行中有一个12位数字。

AccountNumber
=============
136854775807
293910210121
763781239182

是否可以仅根据该行的数量来改变单行的数量?例如136854775807将成为573145887067

2 个答案:

答案 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);