segunda-feira, 19 de novembro de 2012

Adicionando caracteres à esquerda de um campo no PostgreSQL

Salve salve colegas.

Normalmente quem manipula constantemente com muitos arquivos, principalmente  importação e exportação sempre se depara com arquivos sem layout definido, formatações incorretas, enfim, diversos problemas que dificultam o trabalho de manipulação do arquivo.

Na minha situação, sempre recebo planilhas com informações de clientes e, nestas planilhas sempre tenho o CPF do cliente. Para quem trabalha bastante com as ferramentas de cálculo disponíveis no mercado sabe que, normalmente quando o CPF possui zeros a esquerda, estes são 'eliminados' pela ferramenta e, quando importamos isto para nosso banco de dados a informação vai incorreta.

Montar um script padrão ou desenvolver um sistema para importação destes arquivos é o ideal, mas isto quando trabalhamos com um layout definido.Outra saída seria abrir a planilha e definir o tamanho do campo, mas ai perderia a graça fazer isto, pois, não teríamos este post (:d). Deixando o contexto de lado, vamos a situação na prática.

Minha importação de clientes é feita para a tabela pessoa, que possui a seguinte estrutura:
 CREATE TABLE public.pessoa (  
  id_pessoa       integer NOT NULL,  
  nome         varchar(100),  
  cpf      varchar(30) NOT NULL,  
  dtm_cadastro     timestamp WITHOUT TIME ZONE NOT NULL DEFAULT now(),  
  id_usuario_cadastro  bigint NOT NULL,  
  dtm_alteracao     timestamp WITHOUT TIME ZONE DEFAULT now(),  
  id_usuario_alteracao bigint,  
  /* Keys */  
  CONSTRAINT pessoa_pkey  
   PRIMARY KEY (id_pessoa)  
 ) WITH (  
   OIDS = FALSE  
  );  

Nesta tabela possuo o seguinte registro:
 Select id_pessoa,nome,cpf From pessoa;  
 1     Papo Sql     123456789  

Como podemos ver o CPF existente em minha tabela esta incorreto, pois, possui apenas nove números. Sabendo que o CPF possui 11 números usamos então a função lpad para completar com zeros à esquerda.


A função possui a seguinte estrutura de sintaxe:

lpad(string textlength int[fill text])

Primeira posição (string text), deve ser inserido o campo qual pretende-se completar com a sequencia de caracteres.

Segunda posição (length int), deve ser informado o tamanho a ser retornando pela função.

Terceira posição (fill text), deve ser informado o valor que será inserido/repetido à esquerda do campo.

Em nosso exemplo então teremos:
 Select id_pessoa,nome,lpad(cpf,11,'0') From pessoa;  
 1     Papo Sql     00123456789  

Pronto, campo completado, mas não resolvido o problema, pois, temos apenas um select, a informação na tabela ainda está incorreta, para corrigir isto realizamos a atualização do valor:
 update pessoa  
 set cpf = lpad(cpf,11,'0')  
 where id_pessoa = 1;  

Um ponto a se ressaltar é, o retorno da função sempre será texto, caso o campo a ser atualizado seja um inteiro, deverá haver um conversão de dados.

Voltando ao início do post, mencionei a importação e exportação, então pontuando brevemente sobre a exportação, podemos usar este mesmo contexto, agora exportando os dados do cliente.

Digamos que agora na exportação eu tenha um layout predefinido para seguir e, nele o meu campo CPF tem tamanho 14, devido ao layout prever pessoas físicas e jurídicas, então eu faço:
 Select id_pessoa,nome,lpad(cpf,14,' ') From pessoa;  
 1     Papo Sql    '   00123456789'  

Veja que neste caso eu preenchi com espaços, pois, nosso cliente é uma pessoa física, não jurídica.

Como podemos ver, a função lpad pode ser utilizada de diversas formas, o que vai variar somente é o contexto. Aqui discutimos sua usabilidade no PostgreSQL, mas ela também é nativa no MySQL e  Oracle.

Agora, caso precise fazer tudo que fizemos adicionando valores a direta, inverta o lpad para rdad, função que possui a mesma estrutura de sintaxe do lpad.

Grande abraço e até a próxima.

Material de referência:
http://www.postgresql.org/docs/8.2/static/functions-string.html
http://ricardospinoza.wordpress.com/2010/08/13/preencher-zeros-a-esquerda-com-funcao-oracle/

Clique aqui e veja todas as matérias sobre PostgreSQL

4 comentários:

  1. Obrigado, salvou a correção de uma migração que fiz, onde os códigos NCM dos produtos devem ter 8 dígitos, e a maioria haviam entrado com 7 dígitos (pois cortou o zero a esquerda). Update com sucesso.

    ResponderExcluir
    Respostas
    1. Olá Marcello, fico feliz por ter ajudado.

      Obrigado pelo feedback.

      Excluir
  2. Obrigado,....Faco minhas as palavras do colega salvou minha migração.....Grande abraço...

    ResponderExcluir