首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据行中的数字进行数字洗牌

根据行中的数字进行数字洗牌
EN

Stack Overflow用户
提问于 2017-09-12 12:51:51
回答 2查看 115关注 0票数 0

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

代码语言:javascript
复制
AccountNumber
=============
136854775807
293910210121
763781239182

是否有可能仅仅根据一行的数目来调整单个行的编号?136854775807会变成573145887067

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-09-12 13:14:44

我已经创建了一个用户定义的函数来洗牌数字。

我所做的是,取出每个字符,并将其与一个随机数一起存储在一个表变量中。最后,将每个字符按随机数的升序串联起来。

在用户定义的函数中使用RAND函数是不可能的.所以创建了一个VIEW来获取一个随机数。

视图: random_num

代码语言:javascript
复制
create view dbo.[random_num]
as
select floor(rand()* 12) as [rnd];

随机数不一定在0到12之间,我们可以给出一个更大的数,而不是12。

用户定义函数: fn_shuffle

代码语言:javascript
复制
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

然后,您就可以像下面这样使用这个函数。

代码语言:javascript
复制
select [acc_no], 
dbo.[fn_shuffle]([acc_no]) as [shuffled]
from dbo.[your_table_name];

在这里找到一个演示

票数 1
EN

Stack Overflow用户

发布于 2017-09-12 13:49:32

我看不出有什么用处,但你可以。有一种方法:

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46176912

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档