Formatando saída com regexp_replace – CPF
Estava analisando algumas queries de relatório e muitas delas tratavam saída de CPF utilizando SUBSTR e vários subcomponentes para tratar essa saída.
Observei que o código era algo do tipo abaixo:
SUBSTR(C1,1,3)||'.'||SUBSTR(C1,4,3)||'.'||SUBSTR(C1,7,3)||'-'||SUBSTR(C1,10)
Pensei que poderia utilizar o regexp_replace para minimizar a utilização de várias funções com concatenação para algo mais simples, observem como ficaria:
REGEXP_REPLACE(C1, '^(\d{3})(\d{3})(\d{3})(\d{2})
Observem que substituímos a utilização de quatro funções SUBSTR por uma única REGEXP_REPLACE, o que mudou foi como formatamos a saída.
Praticando
Para a prática, preparei o seguinte ambiente para exemplificação.
SQL> create table t1 (cpf varchar2(11));
SQL> insert into t1 values('12345678901');
SQL> insert into t1 values('12345678911');
SQL> insert into t1 values('12345678921');
SQL> insert into t1 values('12345678931');
SQL> insert into t1 values('12345678941');
SQL> insert into t1 values('12345678951');
SQL> insert into t1 values('12345678961');
SQL> insert into t1 values('12345678971');
SQL> insert into t1 values('12345678981');
SQL> insert into t1 values('12345678991');
SQL> commit;
Testando a utilização do regexp
SQL> select regexp_replace(cpf, '^(\d{3})(\d{3})(\d{3})(\d{2})
Observem como funcionam os argumentos utilizados:
regexp_replace(COLUNA, 'BUSCA', 'RESULTADO')
COLUNA : Coluna da tabela
BUSCA: Expressão regular para busca
^..: Indica início do registro
$..: Indica o final do registro
().: Cria um marcador
\d.: Dígitos (números)
{}.: Quantidade de caracteres
(\d{3})..: Marcador de 3 números (exemplo dado)
(\d{2})..: Marcador de 2 números (exemplo dado)
RESULTADO: Como será o resultado da substituição
\1..: Primeiro marcador, e assim por diante para cada () da busca
O marcador mostra onde aparecerá cada campo, um exemplo simples é efetuar a seguinte alteração no regexp para melhorar um pouco o entendimento:
SQL> select regexp_replace(cpf, '^(\d{3})(\d{3})(\d{3})(\d{2})
Observem que o dígito verificador do CPF ficou na frente, e assim podemos redefenir como a saída do regexp poderá sair de formas diferentes com pequenas alterações no código.
Esse pequeno exemplo mostra um pouco do que o regexp pode fazer.
Espero ter ajudado.
Muito bom ! Te adicionei nos meus favoritos ! Espero continuar vendo posts bons iguais a esse.
Olá Braga, tudo bem? Obrigado pelo post. Muito interessante seu post sobre regexp_replace.
Grande abraço,