9 de dez de 2011

Máscara de dados - PostgreSQL

Fazendo uma pesquisa descobri uma maneira fácil de criar máscara de dados usando a função to_char() do PostgreSQL. Para exemplificar teste a seguinte query:

SELECT to_char(12345678901, 'FM000"."000"."000"-"00');


Neste exemplo transformaremos o número 12345678901 (NUMERIC) no texto 123.456.789-01 (TEXT). O que acontece é que a função to_char() tem o poder de converter valores em textos usando máscaras. Isso serve tanto para números, como para datas, entre outros. Mais detalhes em http://www.postgresql.org/docs/8.1/interactive/functions-formatting.html.

Notem que existem algumas curiosidades neste SELECT. A primeira é: o que representa esse FM? Neste caso ele remove espaços em branco antes do texto. Isso porque a função to_char() adiciona esses espaços para criar um padrão de tamanho fixo. Faça o teste e remova o FM e note que há um espaço em branco antes do primeiro zero.

A segunda curiosidade é a presença de aspas duplas. Neste caso elas servem como delimitadores e compõem a máscara. Isso diferencia um ponto flutuante de um ponto qualquer.

Seguindo o mesmo raciocínio podemos criar máscaras para outros tipos de dados, como por exemplo CNPJ, CEP, telefone, etc. Para uma utilização otimizada e para não repetirmos códigos criaremos uma função SQL na linguagem pl/pgsql. Eis o código:


-- Function: public.to_cpf(numeric)


-- DROP FUNCTION public.to_cpf(numeric);


CREATE OR REPLACE FUNCTION public.to_cpf(numeric)
  RETURNS text AS
$BODY$
BEGIN
  RETURN to_char($1, 'FM000"."000"."000"-"00');
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.to_cpf(numeric) OWNER TO postgres;

Essa função recebe um NUMERIC como parâmetro, assim poderemos passar um INTEGER, ou LONG, que o método aceitará numa boa. A partir desse número usaremos a função to_char() para gerar a máscara e retornar o valor. Simples e objetivo.

Faça o mesmo para outras máscaras, por exemplo telefone:

SELECT to_char(12345678901, 'FM"("00") "0000"-"0000');

Ou seja, sempre que for necessário utilizar caracteres diferentes de zero utilize aspas duplas.