none
Função para limpar uma string RRS feed

  • Pergunta

  • Opa a todos,

     

    Pessoal preciso de uma ajudinha simples de vocês, não tenho muito conhecimento em programação do MSSQL entao preciso criar uma função onde eu passe para ela uma string e ela me retorne apenas os numeros que tenham nesta string.

    Exemplo: (011)555-8888 e retorna 0115558888.

    Obrigado.

    Ps. e se tiver como me de um exemplo de como usar ela num campo de um select

    segunda-feira, 23 de janeiro de 2012 16:18

Respostas

  • Joao,

     

    Existem muitas querys que fazem isso na internet, eu pessoalmente, gosto de tratar caso a caso, recentemente fiz uma procedure para limpar telefones, e eu tratrei todos os casos manualmente com um REPLACE
    ex:

    SELECT REPLACE(REPLACE(REPLACE('(011)9234-8945', '-', ''), '(', ''), ')', '')

     

    Algumas pessoas talvez digam que é um trabalho desnecessario, porem, eu, opnião pessoal, prefiro saber exatamente quais os casos que eu estou tratando, para poder evitar, a quem me envia os dados, dados que necessitem ser tratados.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta Joao Nivaldo segunda-feira, 23 de janeiro de 2012 17:04
    segunda-feira, 23 de janeiro de 2012 16:57
    Moderador
  • Acrescentando o que o Fabrizzio já disse...segue também um exemplo de como você poderia extrair números de um campo string:

    --Cia função
    create function fnRetornaNumeros (@campo varchar(max))
    returns varchar(max)
    begin
    --Declara variáveis
    declare @i int
    declare @retorno varchar(max)

    --Seta valores iniciais
    set @i = 0
    set @retorno = ''

    while (@i <= len(@campo))
    begin
        --se a letra for um número, então seta o retorno
        if (ASCII(SUBSTRING(@campo, @i, 1)) BETWEEN 48 AND 57 )
            set @retorno = @retorno + SUBSTRING(@campo, @i, 1)
        set @i = @i + 1
    end
    return @retorno
    end
    go

    --cria tabela teste
    create table #teste
    (
        campo varchar(max)
    )
    --insere dados de teste
    insert into #teste (campo) values ('teste1')
    insert into #teste (campo) values ('teste2teste')
    insert into #teste (campo) values ('teste3teste1')

    --Testa função
    select dbo.fnRetornaNumeros (campo) from #teste


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    • Marcado como Resposta Joao Nivaldo domingo, 29 de janeiro de 2012 17:18
    segunda-feira, 23 de janeiro de 2012 17:15

Todas as Respostas

  • Joao,

     

    Existem muitas querys que fazem isso na internet, eu pessoalmente, gosto de tratar caso a caso, recentemente fiz uma procedure para limpar telefones, e eu tratrei todos os casos manualmente com um REPLACE
    ex:

    SELECT REPLACE(REPLACE(REPLACE('(011)9234-8945', '-', ''), '(', ''), ')', '')

     

    Algumas pessoas talvez digam que é um trabalho desnecessario, porem, eu, opnião pessoal, prefiro saber exatamente quais os casos que eu estou tratando, para poder evitar, a quem me envia os dados, dados que necessitem ser tratados.


    Fabrizzio A. Caputo
    MCT
    Certificações:
    Oracle OCA 11g
    MCITP SQL Server 2008 Implementation and Maintenance
    MCITP SQL Server 2008 Developer
    Blog Pessoal: www.fabrizziocaputo.wordpress.com
    Blog Empresa: www.tripletech.com.br/blog
    Twitter: @FabrizzioCaputo
    Email: fabrizzio.antoniaci@gmail.com
    • Marcado como Resposta Joao Nivaldo segunda-feira, 23 de janeiro de 2012 17:04
    segunda-feira, 23 de janeiro de 2012 16:57
    Moderador
  • Valeu a dica.

     

    Obrigadao.

    segunda-feira, 23 de janeiro de 2012 17:04
  • Acrescentando o que o Fabrizzio já disse...segue também um exemplo de como você poderia extrair números de um campo string:

    --Cia função
    create function fnRetornaNumeros (@campo varchar(max))
    returns varchar(max)
    begin
    --Declara variáveis
    declare @i int
    declare @retorno varchar(max)

    --Seta valores iniciais
    set @i = 0
    set @retorno = ''

    while (@i <= len(@campo))
    begin
        --se a letra for um número, então seta o retorno
        if (ASCII(SUBSTRING(@campo, @i, 1)) BETWEEN 48 AND 57 )
            set @retorno = @retorno + SUBSTRING(@campo, @i, 1)
        set @i = @i + 1
    end
    return @retorno
    end
    go

    --cria tabela teste
    create table #teste
    (
        campo varchar(max)
    )
    --insere dados de teste
    insert into #teste (campo) values ('teste1')
    insert into #teste (campo) values ('teste2teste')
    insert into #teste (campo) values ('teste3teste1')

    --Testa função
    select dbo.fnRetornaNumeros (campo) from #teste


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    • Marcado como Resposta Joao Nivaldo domingo, 29 de janeiro de 2012 17:18
    segunda-feira, 23 de janeiro de 2012 17:15
  • Um outro exemplo (melhor):

    create function fnRetornaNumeros (@palavra varchar (max)) returns varchar(max)
    begin
        declare @pos int
        declare @String varchar(max)
        set @String = @palavra
        SET @pos = PATINDEX('%[A-Z]%', UPPER(@String));
        WHILE @pos > 0
        BEGIN
            SET @String = REPLACE(@String, SUBSTRING(@String, @pos, 1), '');
            SET @pos = PATINDEX('%[A-Z]%', UPPER(@String));
        END
        RETURN @String
    end

    select dbo.fnRetornaNumeros ('teste11etet1')


    Abraços, Weslley Moura MCP - MCTS - ORA SqlExpert
    segunda-feira, 23 de janeiro de 2012 17:28