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 text, length 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
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.
ResponderExcluirOlá Marcello, fico feliz por ter ajudado.
ExcluirObrigado pelo feedback.
Obrigado,....Faco minhas as palavras do colega salvou minha migração.....Grande abraço...
ResponderExcluirOlá Julio, obrigado pelo feedback.
Excluir