Formatar cpf e cnpj com update em Postgresql

31/07/2020

5

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.
Responder

Posts

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)(\\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 )

Responder
instrução ficou errada.
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;

Responder
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;
Responder
a terceira tentativa funcionou !!!
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 )

Responder

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários. Para saber mais sobre o uso de cookies,
consulte nossa política de privacidade. Ao continuar navegando em nosso site, você concorda com a nossa política.

Aceitar