CPF
From PostgreSQL wiki
Jump to navigationJump to search
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';