Fra*_*ani 2 javascript sql t-sql sql-server random
我想生成随机的瑞士国民身份证号码 (AHV/AVS)。
我找到了一个可以做到这一点的网站,如果我查看同一页面的源代码,我还可以看到JavaScript 可以生成它的代码。
这些数字是按照以下模式生成的:
756: 是前缀号码,永远不会改变1234: 是一个随机数5678: 是一个随机数9: 是一个随机数7: 是通过此计算生成的
控制号:7 + 6 + 2 + 4 + 6 + 8=335 + 1 + 3 + 5 + 7 + 9=30x 3并与第一个数相加:33 + (30 x 3)=12310模: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可以解析数字并从两个中选择一个。
首先,您当前的逻辑有缺陷,您得到一个 0 到 9999 之间的随机数,但是您没有将该值设置为固定宽度。因此,如果你的随机数是7、9、 和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。
| 归档时间: |
|
| 查看次数: |
967 次 |
| 最近记录: |