quinta-feira, 18 de fevereiro de 2010

Função que retorna apenas números de uma STRING

Informado sobre um problema em um processo de ETL, verifiquei que um determinado campo no arquivo de origem, que esperava-se ser numérico, muitas vezes continha caracteres não numéricos como barras, traços ou vírgulas e em algumas situações caracteres não esperados.
Alguns analistas criaram “ajustes” para cada um dos caracteres possíveis:
  ( ISNUMERIC(REPLACE(SUBSTRING(nu_cpf_cnpj, 3, 14),'-','')) = 0
      OR ISNUMERIC(REPLACE(SUBSTRING(nu_cpf_cnpj, 3, 14),'/','')) = 0 ) 

Porém como o número de caracteres inesperados acabou crescendo, e o nível de stress na operação aumentou, pensei em uma solução mais definitiva, através de uma função que retorna apenas os números de um VARCHAR.
create function dbo.f_SomenteNumeros(@valor varchar(25))
      returns varchar(MAX)
as
begin

      declare @resultado varchar(MAX)
      declare @i int
      declare @length int

      select
            @resultado=''
            ,@i=0

      while @i<len(@valor)+1
      begin

            if substring(@valor,@i,1) in ('0','1','2','3','4','5','6','7','8','9')
                  select @resultado=@resultado+substring(@valor,@i,1)

            select @i=@i+1
      end

      return @resultado

end
GO

select dbo.f_SomenteNumeros('a*&%¨*&¨1')
Até a próxima!

3 comentários:

  1. Olá, sou iniciante em sql e não entendi como você faz para usar a função com uma coluna da tabela

    exemplo, tabela teste e coluna cep
    ficaria assim ?

    select dbo.f_SomenteNumeros(teste.cep) ?

    ResponderExcluir
  2. Isso mesmo Colega.



    Considerando o exemplo da tabela 'teste' coluna 'cep', ficaria assim



    Select

    dbo.f_SomenteNumeros(t.cep)

    from

    teste t


    Att.

    ResponderExcluir
  3. Parabéns Rodrigo!
    Era exatamente o que eu estava tentando fazer e fiquei agarrado ao tentar elaborar a solução.

    Obrigado por compartilhar o seu conhecimento!

    [ ]s,
    Cristiano Coelho de Lima

    ResponderExcluir

Leave your comment here!