Translate

sábado, 11 de abril de 2015

Postgresql - Formatar CEP com REGEXP_REPLACE

Neste artigo, vamos mostrar 3 exemplos de como utilizar a função REGEXP_REPLACE para formatar CEP. 
Veja qual a forma é mais simples para você, eu considero a do 3º exemplo.

Caso tenha interesse, veja o script no github, faça o download ou execute no Sqlfiddle

1º Exemplo

Para formatar o CEP vamos utilizar a tabela "tb_endereco", exibida na imagem a seguir:


Solução

Observe que na função REGEXP_REPLACE:
  • Utilizamos parenteses "( )" para separar cada parte da string, neste caso o CEP;
  • Utilizamos colchetes   "[ ]" para indicar quais os caracteres que iremos utilizar em cada parte, neste caso utilizamos caracteres numéricos de "0" até "9", representados pela expressão 0-9;
  • Indicamos dentro das chaves "{}" a quantidade de dígitos que vamos utilizar; 
  • Utilizamos contra-barra "\" antes de cada parte criada;
Após a execução da sentença, teremos o seguinte resultado:


 2º Exemplo

Podemos substituir a expressão "0-9" que indica a utilização de caracteres numéricos de 0 até 9, pela expressão "[:digit:]". O resultado será o mesmo. 

Solução


Após a execução da sentença, teremos o seguinte resultado:



3º Exemplo

Para facilitar, podemos substituir a expressão "[[:digit:]]" que indica a utilização de caracteres numéricos de 0 até 9, pela expressão abreviada "\d". O resultado será o mesmo.

Solução



Após a execução da sentença, teremos o seguinte resultado:


Deixe o seu comentário ou sugestão.
Gostou?  Siga no Google +  ou Facebook.

6 comentários:

  1. Consegui formatar o CEP aqui.

    Obrigado.

    ResponderExcluir
  2. Respostas
    1. Obsevação o comando SELECT...REGEXP_REPLACE… não altera os dados da coluna “cep” da tabela “tb_endereco”.
      Este comando permite apenas visualizar o dado em um formato diferente, neste caso, "nnnnn-nnn".

      Caso queira alterar o dado que está gravado na tabela você deve utilizar o comando update.

      Importante, a coluna cep deve ser do tipo varchar:

      /*Este comando atualiza os dados da coluna cep
      de nnnnnnnn para nnnnn-nnn*/

      UPDATE tb_endereco SET cep = REGEXP_REPLACE (cep, '(\d{5})(\d{3})', '\1-\2')
      WHERE
      true = ALL
      (
      SELECT
      cep SIMILAR TO '([0-9]{8})'
      FROM
      tb_endereco
      );

      /*O filtro (WHERE) verifica se todos os dados da coluna cep possuem exatamente 8 dígitos de 0 a 9,
      se houver pelo menos 1 cep fora deste padrão
      nenhum registro será atualizado
      caso contrário todos os registros da coluna cep serão atualizado.
      */

      Segue abaixo o comando para verificar se há CEPS fora do padrão, caso precise:


      /*Comando para verificar cep fora do formato nnnnnnnn*/
      SELECT
      cep
      FROM
      tb_endereco
      WHERE
      cep NOT SIMILAR TO '([0-9]{8})'

      Excluir
  3. Valeu! Precisei apenas fazer um CAST, porque minha tabela armazena o cep como integer
    ex:regexp_replace(cast (e2.cep as varchar), '(\d{5})(\d{3})', '\1-\2') as "CEP"

    ResponderExcluir