CPF

From PostgreSQL wiki
Jump to navigationJump to search

Snippets

CPF validation

Works with PostgreSQL

Any version

Written in

SQL

Depends on

Nothing


CPF validation implemented by Euler Taveira de Oliveira in pure SQL.

-- -- Esta função retorna true se o CPF é válido e falso caso contrário -- Ela verifica o tamanho e os dígitos verificadores -- CREATE OR REPLACE FUNCTION verify_cpf(text) RETURNS BOOLEAN AS $$ -- se o tamanho for 11 prossiga com o cálculo -- senão retorne falso SELECT CASE WHEN length($1) = 11 THEN (  -- verifica se os dígitos coincidem com os especificados  SELECT  substr($1, 10, 1) = CAST(digit1 AS text) AND  substr($1, 11, 1) = CAST(digit2 AS text)  FROM  (  -- calcula o segundo dígito verificador (digit2)  SELECT  -- se o resultado do módulo for 0 ou 1 temos 0  -- senão temos a subtração de 11 pelo resultado do módulo  CASE res2  WHEN 0 THEN 0  WHEN 1 THEN 0  ELSE 11 - res2  END AS digit2,  digit1  FROM  (  -- soma da multiplicação dos primeiros 9 dígitos por 11, 10, ..., 4, 3  -- obtemos o módulo da soma por 11  SELECT  MOD(SUM(m * CAST(substr($1, 12 - m, 1) AS integer)) + digit1 * 2, 11) AS res2,  digit1  FROM  generate_series(11, 3, -1) AS m,  (  -- calcula o primeiro dígito verificador (digit1)  SELECT  -- se o resultado do módulo for 0 ou 1 temos 0  -- senão temos a subtração de 11 pelo resultado do módulo  CASE res1  WHEN 0 THEN 0  WHEN 1 THEN 0  ELSE 11 - res1  END AS digit1  FROM  (  -- soma da multiplicação dos primeiros 9 dígitos por 10, 9, ..., 3, 2  -- obtemos o módulo da soma por 11  SELECT  MOD(SUM(n * CAST(substr($1, 11 - n, 1) AS integer)), 11) AS res1  FROM generate_series(10, 2, -1) AS n  ) AS sum1  ) AS first_digit  GROUP BY digit1  ) AS sum2  ) AS first_sec_digit ) ELSE false END; $$ LANGUAGE 'SQL' IMMUTABLE STRICT; COMMENT ON FUNCTION verify_cpf(text) IS 'retorna verdadeiro se e, somente se, o CPF  possui o tamanho correto (11 dígitos) e os dígitos calculados coincidem com os especificados';