Flávio Silveira Programação & Desenvolvimento

  • BLOG
  • SOBRE
  • PORTFOLIO
  • CONTATO

Tratando CPF, CNPJ, Primeiro nome e Data pelo SQL (Postgre)

January 21st, 2009  |  Published in Banco de Dados, Programação SQL

Olhando para os códigos php no trabalho, como tem sido de costume para averiguar erros e algoritmos que possa melhorar, me deparo em vários controllers com uma série de splits e loops para horas tratar o cpf, horas tratar o cnpj que vem do banco de dados.

No banco de dados estes campos estão salvos em um domínio String, e gravados sem pontuação ou dígitos. Então quando você quer mostrar para o usuário, para não deixar aquele emaranhado de números, você deixa as coisas como ele está acustumado a ver, com os pontos e etc.

Para não ficar repetindo a mesma rotina em vários locais do sistema, nem mesmo criar um método que eu tenha que chamar sempre que quiser um tratamento desses, já trago a coisa toda pronta no retorno da consulta. Simples, confira…

Trazendo o CPF com a pontuação e o dígito antes dos dois últimos numerais

SELECT SUBSTR(cpf, 1, 3) || '.' || SUBSTR(cpf, 4, 3) || '.' ||
SUBSTR(cpf, 7, 3) || '-' || SUBSTR(cpf, 10) AS cpf
FROM e001_pessoas
WHERE pessoaid = 33;

Explicação:
SELECT – estamos selecionando algo do banco SUBSTR – é uma função SQL, a mesma do PHP, a mesma do javascript que conhecemos, que serve para trazer parte de uma string.
Sintaxe – SUBSTR(campo, á partir de qual caracter começar, o máximo de caracteres a trazer) , sendo esse último opcional.

Então repare começo pegando do campo CPF, a partir do campo 1, 3 caracteres. Em seguida faço uma concatenação, que no SQL é feita com dois pipelines (||). Concateno com um ponto (está entre aspas pois é uma string).
Depois mais uma vez pego outro pedaço do campo cpf, dessa vez começando do 4° caracter. São mais 3 caracteres e mais uma concatenação com um ponto. Novamente mais um pedaço do cpf , começando do 7° caracter. São mais 3 caracteres e agora um dígito, o famoso tracinho.
Finalizo essa parte pegando o restante do CPF, que está a partir do caracter 10. Não limitei o número de caracteres nesse último, pois quero todo o restante.

Em seguida faço um ALIAS para o meu resultado, chamando de ‘cpf’. Caso você não o faça o nome do campo  retornará como unknow ou com uma interrogação.
FROM – para indicar a tabela onde está o campo, que no meu caso é a e001_pessoas.
WHERE – para trazer apenas o cpf do registro pessoaid = 33.

Então a coisa toda é muito simples. Tenho meu cpf salvo no banco como um grande número. Pego 3 caracteres dele, concateno com um ponto, mais 3 caracteres, concateno a outro ponto, e assim por diante seguindo o modelo do cpf.

Para o CNPJ funciona igual. Basta ver como é dividido o número do CNPJ, e ver quantos dígitos trazer, concatenar a que símbolo e assim por diante. Confira:

SELECT SUBSTR(cnpj, 1, 2) || '.' || SUBSTR(cnpj, 3, 3) || '.' ||
SUBSTR(cnpj, 6, 3) || '/' || SUBSTR(cnpj, 9, 4) || '-' ||
SUBSTR(cnpj, 13) AS cnpj
FROM t020_clientes;

Acima trouxemos todos os CNPJ’s da tabela de clientes já com a devida pontuação e a coisa toda.

Uma outra situação é quando queremos mostrar apenas o primeiro nome da pessoa na tela. Novamente falando, você pode tratar isso onde quiser, mas o SQL pode fazer isso para você, então porque deixar isso passar…

SELECT SPLIT_PART(nome, '  ', 1) AS nome
FROM e001_pessoas
WHERE pessoaid = 33;

Acima usamos a função do SQL, SPLIT_PART, que se assemelha muito a SPLIT do php e a SPLIT do javascript, dividindo a string em pedaços, de acordo com um separador comum.
Sintaxe – SPLIT_PART(campo que queremos dividir, separador entre as partes, parte que eu quero mostrar)

Então na SQL mostrada, a SPLIT_PART, separou o meu campo nome em partes, de acordo com o espaço em branco.
Exemplo:  se o meu campo é ‘Maria Francisca Joana’, a função separou em 3 partes. 1 – Maria, 2 – Francisca e 3 – Joana.
Nó último parâmetro da função eu passo a parte que eu quero mostrar. No meu caso como quero apenas o primeiro nome, trago só a primeira parte.

Outro caso, esse já bem mais usado, é quando eu tenho um campo de domínio DATE, e quero trazer no resultado da consulta como uma string já com os separadores de dia, mês e ano.
Digamos que você queira trazer a data no seguinte formato DD/MM/AAAA.

SELECT TO_CHAR(dtnascimento, 'DD/MM/YYYY') AS dtnascimento
FROM e001_pessoas
WHERE pessoaid = 33;

Usando a função TO_CHAR você consegue isso.
Sintaxe – TO_CHAR(campo à transformar, formato que você quer).
Cuidado ! Repare no Y de Year, e não A de ano.

Experimente outras formatações. Deixem o SQL trabalhar por vocês.

Abraços!
Valeu !!!

Compartilhe
  • Print
  • del.icio.us
  • Facebook
  • Google Bookmarks
  • LinkedIn
  • Live
  • MySpace
  • PDF
  • RSS
  • Twitter
  • email

Posts Relacionados

  • Formatando CPF no SQL com Expressões Regulares – RegexReplace
  • Limitando o SELECT do SQL em diferentes Bancos de Dados
  • Função para contar Palavras (Padrão de caracteres) em uma String Microsoft SQL Server

Deixe um comentário

Flávio Silveira

Programação & Desenvolvimentominha foto

Rss Logo Twitter Logo

Blogroll

  • Aurélio Marinho Jargas
  • Fábio Tomio
  • Mozart Petter
  • Renie Siqueira
  • Willian Rodriguez

Tags & Categorias

add-ons Apache apple arrays Banco de Dados CodeIgniter complementos Configuração PHP debug erro 500 erros de servidor Expressões Regulares facilidade formatação via sql Forms framework php geração de cadastros Geração de formulários Internet Explorer não salva session iphone ipod touch Layouts mozart petter mozilla firefox multiple site múltiplos sites com codeIgniter Php postgres Programação em geral reestruturando CodeIgniter Regex Replace Shell smarty SQL Sql Server Template engine Tempo de sessão codeIgniter Apache (1)
Banco de Dados (4)
Browsers (2)
CodeIgniter (7)
Expressões Regulares (1)
IPhone – Desenvolvimento (2)
JavaScript (1)
Php (9)
Programação em geral (10)
Programação SQL (4)
Screencast (1)
Servidor (1)
Shell Script (1)

WP Cumulus Flash tag cloud by Roy Tanck and Luke Morton requires Flash Player 9 or better.



©2010 Flávio Silveira
Powered by WordPress adapted of Gridline Lite of author Graph Paper Press.