Formatar cpf e cnpj com update em Postgresql
Formatar cpf e cnpj com Postgresql
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.
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
Curtidas 0
Respostas
Emerson Nascimento
31/07/2020
acredito que a melhor forma é através de uma função:
antes de executar o update, é bom fazer um teste:
se tudo estiver ok, basta executar o update:
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:
select p_cpfcnpj Original, FormatCPFCNPJ( p_cpfcnpj ) Formatado, * from tabela
se tudo estiver ok, basta executar o update:
update tabela set p_cpfcnpj = FormatCPFCNPJ( p_cpfcnpj )
GOSTEI 0
Emerson Nascimento
31/07/2020
instrução ficou errada.
o mecanismo do fórum trocou os caracteres.
segunda tentativa:
o mecanismo do fórum trocou os caracteres.
segunda tentativa:
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
Emerson Nascimento
31/07/2020
terceira tentativa:
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
Emerson Nascimento
31/07/2020
a terceira tentativa funcionou !!!
então vamos lá...
acredito que a melhor forma é através de uma função:
antes de executar o update, é bom fazer um teste:
se tudo estiver ok, basta executar o update:
então vamos lá...
acredito que a melhor forma é através de uma função:
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:
select p_cpfcnpj Original, FormatCPFCNPJ( p_cpfcnpj ) Formatado, * from tabela
se tudo estiver ok, basta executar o update:
update tabela set p_cpfcnpj = FormatCPFCNPJ( p_cpfcnpj )
GOSTEI 0