【发布时间】:2023-03-08 14:05:01
【问题描述】:
我有一个巴西 CPF 号码的数据库字段,并想检查它们的有效性。这些是 11 位字符串,即 9 位和 2 位校验和。
我目前在 MS Excel 中实现了校验和(见下文),但我想找到一种在 SQL 中执行此操作的方法。
校验和的工作原理如下:(抓紧,这太疯狂了。)
- CPF 编号以 ABCDEFGHI / JK 形式或直接写为 ABCDEFGHIJK,其中的数字不能全部相同。
- J 称为 CPF 编号的第 1 位校验。
- K 称为 CPF 编号的第二个校验位。
第一个数字(J):
将前 9 位的每个数字乘以一个常数:
10*A + 9*B + 8*C + 7*D + 6*E + 5*F + 4*G + 3*H + 2*I将此和除以 11,如果余数为 0 或 1,则 J 将为 0。如果余数 >=2,则 J 将为
11 - remainder。
第二位(K):(相同的计算,但包括数字J)
将前 10 位的每个数字乘以一个常数:
11A + 10B + 9C + 8D + 7E + 6F + 5G + 4H + 3I + 2J将此和除以 11,如果余数为 0 或 1,则 K 将为 0。如果余数 >=2,则 K 将为
11 - remainder。
--MS Excel中的实现--
假设 CPF 在 A2 中。
欢迎在这里进行优化,但并不是这个问题的重点。
数字 J:=IF(MOD(SUM(MID($A2,1,1)*10,MID($A2,2,1)*9,MID($A2,3,1)*8,MID($A2,4,1)*7,MID($A2,5,1)*6,MID($A2,6,1)*5,MID($A2,7,1)*4,MID($A2,8,1)*3,MID($A2,9,1)*2),11)<=1,NUMBERVALUE(LEFT(RIGHT($A2,2),1))=0,NUMBERVALUE(LEFT(RIGHT($A2,2),1))=(11-MOD(SUM(MID($A2,1,1)*10,MID($A2,2,1)*9,MID($A2,3,1)*8,MID($A2,4,1)*7,MID($A2,5,1)*6,MID($A2,6,1)*5,MID($A2,7,1)*4,MID($A2,8,1)*3,MID($A2,9,1)*2),11)))
数字 K:
=IF(MOD(SUM(MID($A2,1,1)*11,MID($A2,2,1)*10,MID($A2,3,1)*9,MID($A2,4,1)*8,MID($A2,5,1)*7,MID($A2,6,1)*6,MID($A2,7,1)*5,MID($A2,8,1)*4,MID($A2,9,1)*3,MID($A2,10,1)*2),11)<=1,NUMBERVALUE(LEFT(RIGHT($A2,1),1))=0,NUMBERVALUE(LEFT(RIGHT($A2,1),1))=(11-MOD(SUM(MID($A2,1,1)*11,MID($A2,2,1)*10,MID($A2,3,1)*9,MID($A2,4,1)*8,MID($A2,5,1)*7,MID($A2,6,1)*6,MID($A2,7,1)*5,MID($A2,8,1)*4,MID($A2,9,1)*3,MID($A2,10,1)*2),11)))
【问题讨论】:
-
我想你只需要知道Oracle中有一个substr函数。 docs.oracle.com/cd/B19306_01/server.102/b14200/functions162.htm
标签: sql oracle algorithm checksum