T-SQL :: 生成随机瑞士国民身份证号 (AHV/AVS)

Fra*_*ani 2 javascript sql t-sql sql-server random

我想生成随机的瑞士国民身份证号码 (AHV/AVS)。

我找到了一个可以做到这一点的网站,如果我查看同一页面的源代码,我还可以看到JavaScript 可以生成它的代码

这些数字是按照以下模式生成的:

在此输入图像描述

  1. 756: 是前缀号码,永远不会改变
  2. 1234: 是一个随机数
  3. 5678: 是一个随机数
  4. 9: 是一个随机数
  5. 7: 是通过此计算生成的 控制号:
    • 从第一个数字开始,取所有其他数字并将它们相加:7 + 6 + 2 + 4 + 6 + 8=33
    • 从 drcond 数字开始,取所有其他数字并对它们求和:5 + 1 + 3 + 5 + 7 + 9=30
    • 然后将第二个数相乘x 3并与第一个数相加:33 + (30 x 3)=123
    • 现在减去该数字的10模:10-(123%10)==10-37

===> 这就是我们最终获得7最后一个数字的方式<===

我创建了一个 SQL 命令,可以生成我需要的随机数:

SELECT CONCAT('756.', 
FLOOR(RAND(CHECKSUM(NEWID()))*(9999-1000+1)+1000) , '.',
FLOOR(RAND(CHECKSUM(NEWID()))*(9999-1000+1)+1000) , '.',
ABS(CHECKSUM(NEWID()))%10
-- How to select one number out of two? 
)
Run Code Online (Sandbox Code Playgroud)

此代码生成我需要的所有随机数,但我缺少如何从两个数字中选择一个数字。

我不知道是否T-SQL可以解析数字并从两个中选择一个。

use*_*983 5

首先,您当前的逻辑有缺陷,您得到一个 0 到 9999 之间的随机数,但是您没有将该值设置为固定宽度。因此,如果你的随机数是79、 和2,那么你最终会得到792 not 00700090002。您需要添加前导零。我用CONCAT和 来做到这一点RIGHT

接下来,我将表达式移动到 中,FROM以便它具体化并且易于使用。然后我们可以使用SUBSTRINGandCONVERT来获取你的号码和它们的两部分SUM,然后最后应用最终的逻辑。然后我将句点注入字符串中。

SELECT V.NIN,
       STUFF(STUFF(STUFF(CONCAT(V.NIN,10 - ((Odds + (Evens * 3)) % 10)),12,0,'.'),8,0,'.'),4,0,'.')
FROM (VALUES(CONCAT(RIGHT(CONCAT('000','756'),3), 
                    RIGHT(CONCAT('0000',FLOOR(RAND(CHECKSUM(NEWID()))*(9999-1000+1)+1000)),4),
                    RIGHT(CONCAT('0000',FLOOR(RAND(CHECKSUM(NEWID()))*(9999-1000+1)+1000)),4),
                    ABS(CHECKSUM(NEWID()))%10)),
            ('756123456789'))V(NIN)
     CROSS APPLY (VALUES(CONVERT(int,SUBSTRING(V.NIN,1,1)) + CONVERT(int,SUBSTRING(V.NIN,3,1)) + CONVERT(int,SUBSTRING(V.NIN,5,1)) + CONVERT(int,SUBSTRING(V.NIN,7,1)) + CONVERT(int,SUBSTRING(V.NIN,9,1)) + CONVERT(int,SUBSTRING(V.NIN,11,1)),
                         CONVERT(int,SUBSTRING(V.NIN,2,1)) + CONVERT(int,SUBSTRING(V.NIN,4,1)) + CONVERT(int,SUBSTRING(V.NIN,6,1)) + CONVERT(int,SUBSTRING(V.NIN,8,1)) + CONVERT(int,SUBSTRING(V.NIN,10,1)) + CONVERT(int,SUBSTRING(V.NIN,12,1))))I(Odds,Evens)
Run Code Online (Sandbox Code Playgroud)

但老实说,我建议这可能适合您的应用程序,而不是 SQL。