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

Responder a