Fórum Formatar cpf e cnpj com update em Postgresql #612277
31/07/2020
0
Eu tenho um campo chamado p_cpfcnpj, desejo atualizar todos os registros nesse campo, sendo uma condição para aqueles com até 11 dígitos que serão formatados como cpf e aqueles com mais de 11 dígitos para cnpj e aqueles com menos de 11 os dígitos serão atualizados como nulos.
Cpf é um dado de identificação pessoal no brasil, e o cnpj é um dado de identificação de empresas no brasil, cada uma com sua máscara.
Postgresql! Mas pode ser mysql.
Máscara Cpf: 999.999.999-99 Máscara Cnpj: 99.999.999 / 9999-99 * Preciso do sql. Atualize o conjunto de clientes p_cpfcnpj = "..." onde p_cpfcnpj = "..." ...
Para aplicar essa máscara, primeiro, precisarei de outro sql com atualização, limpando a máscara, para manter apenas os números, para garantir que todos recebam a máscara uma vez.
Então, eu também preciso desse sql, para remover a máscara, além de aplicar a máscara!
Vale lembrar que, ao remover a máscara, você não pode apagar os zeros à esquerda.
Hoje ou o campo é do tipo string, alguns são formatados e outros não.

Andre Machado
Curtir tópico
+ 0Posts
31/07/2020
Emerson Nascimento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | CREATE OR REPLACE FUNCTION FormatCPFCNPJ( AlphaText VARCHAR (50) ) RETURNS VARCHAR (50) AS $$ DECLARE FormattedText VARCHAR (50) = '' ; NumChar INTEGER ; NumericChar CHAR ; BEGIN AlphaText := regexp_replace(AlphaText, '[^0-9]' , '' , 'g' ); NumChar := LENGTH( AlphaText ); if (NumChar > 14) OR (NumChar < 11) THEN RETURN NULL ; elsif NumChar = 11 THEN FormattedText := regexp_replace( AlphaText, '(\\d)(\\d)(\\d)(\\d)' , '\\1.\\2.\\3-\\4' ); else FormattedText := regexp_replace( AlphaText, '(\\d)(\\d)(\\d)(\\d)(\\d)' , '\\1.\\2.\\3/\\4' ); end if; RETURN FormattedText; END ; $$ LANGUAGE plpgsql; |
antes de executar o update, é bom fazer um teste:
1 | select p_cpfcnpj Original, FormatCPFCNPJ( p_cpfcnpj ) Formatado, * from tabela |
se tudo estiver ok, basta executar o update:
1 | update tabela set p_cpfcnpj = FormatCPFCNPJ( p_cpfcnpj ) |
Gostei + 0
31/07/2020
Emerson Nascimento
o mecanismo do fórum trocou os caracteres.
segunda tentativa:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | CREATE OR REPLACE FUNCTION FormatCPFCNPJ( AlphaText VARCHAR (50) ) RETURNS VARCHAR (50) AS $$ DECLARE FormattedText VARCHAR (50) = '' ; NumChar INTEGER ; NumericChar CHAR ; BEGIN AlphaText := regexp_replace(AlphaText, '[^0-9]' , '' , 'g' ); NumChar := LENGTH( AlphaText ); if (NumChar > 14) OR (NumChar < 11) THEN RETURN NULL ; elsif NumChar = 11 THEN -- '( \\ d { 3 } )( \\ d { 3 } )( \\ d { 3 } )( \\ d { 2 } ) ' sem espaços -- '\\ 1 . \\ 2 . \\ 3 - \\ 4' sem espaços FormattedText := regexp_replace( AlphaText, '(\\d)(\\d)(\\d)(\\d)' , '\\1.\\2.\\3-\\4' ); else -- '( \\ d { 2 } )( \\ d { 3 } )( \\ d { 3 } )( \\ d { 4 } )( \\ d { 2 } ) ' sem espaços -- '\\ 1 . \\ 2 . \\ 3 / \\ 4 - \\ 5 ' sem espaços FormattedText := regexp_replace( AlphaText, '(\\d)(\\d)(\\d)(\\d)(\\d)' , '\\1.\\2.\\3/\\4-\\5' ); end if; RETURN FormattedText; END ; $$ LANGUAGE plpgsql; |
Gostei + 0
31/07/2020
Emerson Nascimento
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | CREATE OR REPLACE FUNCTION FormatCPFCNPJ( AlphaText VARCHAR (50) ) RETURNS VARCHAR (50) AS $$ DECLARE FormattedText VARCHAR (50) = '' ; NumChar INTEGER ; NumericChar CHAR ; BEGIN AlphaText := regexp_replace(AlphaText, '[^0-9]' , '' , 'g' ); NumChar := LENGTH( AlphaText ); if (NumChar > 14) OR (NumChar < 11) THEN RETURN NULL ; elsif NumChar = 11 THEN FormattedText := regexp_replace( AlphaText, '(\d{3})(\d{3})(\d{3})(\d{2})' , '\1.\2.\3-\4' ); else FormattedText := regexp_replace( AlphaText, '(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})' , '\1.\2.\3/\4-\5' ); end if; RETURN FormattedText; END ; $$ LANGUAGE plpgsql; |
Gostei + 0
31/07/2020
Emerson Nascimento
então vamos lá...
acredito que a melhor forma é através de uma função:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | CREATE OR REPLACE FUNCTION FormatCPFCNPJ( AlphaText VARCHAR (50) ) RETURNS VARCHAR (50) AS $$ DECLARE FormattedText VARCHAR (50) = '' ; NumChar INTEGER ; NumericChar CHAR ; BEGIN AlphaText := regexp_replace(AlphaText, '[^0-9]' , '' , 'g' ); NumChar := LENGTH( AlphaText ); if (NumChar > 14) OR (NumChar < 11) THEN RETURN NULL ; elsif NumChar = 11 THEN FormattedText := regexp_replace( AlphaText, '(\d{3})(\d{3})(\d{3})(\d{2})' , '\1.\2.\3-\4' ); else FormattedText := regexp_replace( AlphaText, '(\d{2})(\d{3})(\d{3})(\d{4})(\d{2})' , '\1.\2.\3/\4-\5' ); end if; RETURN FormattedText; END ; $$ LANGUAGE plpgsql; |
antes de executar o update, é bom fazer um teste:
1 | select p_cpfcnpj Original, FormatCPFCNPJ( p_cpfcnpj ) Formatado, * from tabela |
se tudo estiver ok, basta executar o update:
1 | update tabela set p_cpfcnpj = FormatCPFCNPJ( p_cpfcnpj ) |
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)