我想生成隨機的瑞士身份證號碼 (AHV/AVS)。
我找到了一個
756: 是前綴號碼,它永遠不會改變1234: 是一個亂數5678: 是一個亂數9: 是一個亂數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-3=7
- 從第一個數字開始,每隔一個數字將它們相加:
===>這就是我們最終獲得
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?
)
這段代碼生成了我需要的所有亂數,但我不知道如何從兩個數字中選擇一個。
我不知道是否T-SQL可以決議數字并從兩個中選擇一個。
uj5u.com熱心網友回復:
首先,您當前的邏輯有缺陷,您會得到 0 到 9999 之間的亂數,但是您沒有將該值設為固定寬度。其結果是,如果你的亂數分別為7,9和2,你會最終792 沒有 00700090002。您需要添加前導零。我用CONCAT和來做這件事RIGHT。
接下來,我將運算式移到 中FROM,使其具體化并易于使用。然后我們可以使用SUBSTRING和CONVERT來得到你的數字的2部分和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)
但是,老實說,我建議這可能適合您的應用程式,而不是 SQL。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/380329.html
標籤:javascript sql sql-server 查询语句 随机的
下一篇:將特定列轉置為單行
