Euler Taveira de Oliveira escreveu:
> Osvaldo Rosario Kussama wrote:
>
>> Use a função to_number, veja:
>> http://www.postgresql.org/docs/8.2/interactive/functions-formatting.html
>>
>> bdteste=# SELECT to_number('855.999.666-96',99999999999);
>> to_number
>> -----------
>> 855999666
>> (1 registro)
>>
> Eu não utilizaria esta função pois CPFs que iniciam com zero(s) seriam
> desconsiderados. Houve até uma discussão recente se não seria adequado
> validar a máscara. Eu utilizaria translate ou regexp_replace.
>
> regression=# select translate(translate('012.345.678-90', '-', ''), '.',
> '');
> translate
> -------------
> 01234567890
> (1 registro)
>
>
Euler:
Creio que depende do resultado desejado.
Se desejar numérico então 01 e 1 são absolutamente iguais e neste caso
creio que a função to_number é adequada.
bdteste=# SELECT to_number('09.876.543/1234-12','99 999 999 9999 99');
to_number
---------------
9876543123412
(1 registro)
Se desejar string aí sim '01' e '1' são diferentes. Neste caso creio que
o mais simples seja utilizar o regexp_replace:
bdteste=# SELECT regexp_replace('09.876.543/1234-12','[^[:digit:]]','','g');
regexp_replace
----------------
09876543123412
(1 registro)
Em minha opinião os campos CPF e CNPJ são numéricos e portanto devem ser
declarados desta forma, NUMERIC(14) e NUMERIC(11) respectivamente ou
mesmo BIGINT. Quanto a exibição aí sim devemos formatá-los com a máscara
adequada:
bdteste=# SELECT to_char(9876543123412,'09"."999"."999"/"9999"-"99') as
cnpj;
cnpj
---------------------
09.876.543/1234-12
(1 registro)
bdteste=# SELECT to_char(987654312,'099"."999"."999"/"99') as cpf;
cpf
-----------------
009.876.543/12
(1 registro)
Osvaldo
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral