quarta-feira, 31 de agosto de 2011

Função para retornar somente números em uma string no SQL Server

    Em algumas situações precisamos que a consulta de uma campo retorne somente o valor númerico, desprezando máscaras, ou valores inconsistentes, por exemplo o CEP sem as edições.
    Abaixo uma função para o SQL Server que "limpa" o conteúdo do campo deixando somente os caracteres numéricos no resultado.

CREATE FUNCTION [dbo].[TiraLetras]
 (
 @Resultado VARCHAR(8000)
 )
 RETURNS VARCHAR(8000)
 AS
 BEGIN
    DECLARE @CharInvalido SMALLINT
    SET @CharInvalido = PATINDEX('%[^0-9]%', @Resultado)
    WHILE @CharInvalido > 0
    BEGIN
       SET @Resultado = STUFF(@Resultado, @CharInvalido, 1, '')
       SET @CharInvalido = PATINDEX('%[^0-9]%', @Resultado)
    END
    SET @Resultado = @Resultado
    RETURN @Resultado
 END

Select dbo.TiraLetras('AB12CD34%¨&*(56')
Resultado: '123456'


Select dbo.TiraLetras('95.012-500') 'CEP'
Resultado:  '95012500'

8 comentários:

  1. Em Oracle é bem mais simples:

    select regexp_replace('01/(234)M?56.78-90a', '[[:punct:]]|[[:alpha:]]') cep from dual;

    retorna um string:

    CEP
    -----------
    01234567890

    ResponderExcluir
    Respostas
    1. Por isso que dba slqserver tem o raciocínio logico muito melhor.

      Excluir
    2. Obrigado!!! ja estamos em 2020 e a informação continua sendo muito util!!!

      Excluir
  2. CESAR BLUMM, MUITO LEGAL ESSA ROTINA EM SQL SERVER, SALVOU MINHA VIDA RSRS, PRECISAVA CORRIGIR TELEFONES E ELA CAIU COMO UMA LUVA.

    ResponderExcluir
  3. Muito Bom!
    select regexp_replace('01/(234)M?56.78-90a', '[[:punct:]]|[[:alpha:]]') cep from dual;

    ResponderExcluir
  4. Show de bola, eu precisava fazer uma consulta removendo mascara de telefones e me atendeu muito bem ;)

    ResponderExcluir