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

5 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
  3. Muito bom!
    Mas como poderia fazer utilizando valores decimais? O LPAD não funciona para eles ;-;

    ResponderExcluir