我有一个巴西公积金号码的数据库字段,想检查它们的有效性。这是11位字符串,9位和2位校验和。
我目前在ms excel中实现了校验和(见下文),但我想找出一种在sql中实现校验和的方法。
校验和的工作原理如下:(抓紧,这是坚果。)
CPF编号以ABCDEFGHI/JK格式书写,或直接以
efghijk,其中的数字不能全部相同。
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将小于cc>。
第二位(k):(相同计算,但包括数字j)
将前10位的每个数字乘以一个常数:
11 - remainder
把这个和除以11,如果余数是0或1,k就是0。如果余数大于等于2,K将小于cc>。
--在ms excel中的实现--
假设CPF在A2。
这里的优化是受欢迎的,但并不是这个问题的重点。
数字J:11A + 10B + 9C + 8D + 7E + 6F + 5G + 4H + 3I + 2J
数字K:
11 - remainder

最佳答案

我的测试表:

-- Create a table called CPF
CREATE TABLE CPF(Id integer PRIMARY KEY, No integer);

-- Create few records in this table
INSERT INTO CPF VALUES(1, 12345678901);

我的巢query
SELECT No,
(CASE WHEN (J != J2) THEN 'J wrong!' ELSE 'J ok!' END) as Jchk,
(CASE WHEN (K != K2) THEN 'K wrong!' ELSE 'K ok!' END) as Kchk
FROM
(SELECT No, J, K,
(CASE WHEN MJ < 2 THEN 0 ELSE 11 - MJ END) as J2,
(CASE WHEN MK < 2 THEN 0 ELSE 11 - MK END) as K2
FROM
(SELECT No, J, K,
MOD(10*A + 9*B + 8*C + 7*D + 6*E + 5*F + 4*G + 3*H + 2*I, 11) as MJ,
MOD(11*A + 10*B + 9*C + 8*D + 7*E + 6*F + 5*G + 4*H + 3*I + 2*J, 11) as MK
FROM
 (SELECT
  No,
  substr(to_char(No), 1, 1) as A,
  substr(to_char(No), 2, 1) as B,
  substr(to_char(No), 3, 1) as C,
  substr(to_char(No), 4, 1) as D,
  substr(to_char(No), 5, 1) as E,
  substr(to_char(No), 6, 1) as F,
  substr(to_char(No), 7, 1) as G,
  substr(to_char(No), 8, 1) as H,
  substr(to_char(No), 9, 1) as I,
  substr(to_char(No), 10, 1) as J,
  substr(to_char(No), 11, 1) as K
  FROM CPF)))
  ;

关于sql - 在SQL中计算校验和,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46301383/

10-09 08:27