Pergunta

Gostaria de saber se existe uma maneira fácil e eficiente no SQL Server 2005 de eliminar caracteres replicados em uma string.Como converter

'ABBBCDEEFFFFG' to 'ABCDEFG'

É realmente uma pena que o SQL Server tenha uma biblioteca de strings tão pobre e nenhum recurso regexp pronto para uso ...

Nenhuma solução correta

Outras dicas

Você pode usar a funcionalidade CLR incorporada no SQL Server 2005/2008 para fazer isso pelo código .NET.

A revista MSDN escreveu sobre isso em seus Fevereiro de 2007 questão.

Se esta não for uma solução aceitável, aqui é um UDF que fará o mesmo, lembre -se de duas ordens de magnitude mais lentamente que a solução CLR.

Ymmv. Isso parece funcionar para sua string acima. Mas não ABBBCDEEBBBBG

DECLARE @Numbers TABLE (Num smallint NOT NULL PRIMARY KEY)

INSERT @Numbers (Num)
SELECT TOP 8000
    ROW_NUMBER() OVER (ORDER BY c1.NAME)
FROM
    sys.columns c1

DECLARE @STuff TABLE (Seq varchar(100) NOT NULL PRIMARY KEY)

INSERT @STuff (Seq) VALUES ('ABBBCDEEFFFFG') --works

SELECT
    Single
FROM
    (
    SELECT DISTINCT
        CAST(Single AS varchar(100))
    FROM
       @Numbers N
       CROSS APPLY 
       (SELECT Seq, SUBSTRING(Seq, Num, 1) AS Single FROM @Stuff) S
    WHERE
       Num <= LEN(Seq)
    FOR XML PATH ('')
    ) foo(Single)

Conheço a solução CLR, mas como disse não sou responsável nem autorizado a implementá-la no banco de dados em questão.

Para este problema específico, decidi escrever um loop muito simples e meio bobo.Receio que não seja rápido o suficiente para milhões de registros, mas de qualquer forma...Eu gostaria de poder fazer essas coisas na camada de aplicativo, mas estou vinculado ao T-SQL aqui.

  DECLARE @i int ;  -- counter
  DECLARE @input varchar(200) ;
  SET @input = 'AAABCDEEFFBBBXYZSSSWWWNT'

  IF LEN(@input) > 1
  BEGIN
    DECLARE @unduplicated varchar(200) ;
    SET @unduplicated = SUBSTRING(@input,1,1) ;

    SET @i = 2 ;
    WHILE @i <= LEN(@input)
    BEGIN
      -- If current char is different from the last char, concatenate, else not
      IF SUBSTRING(@unduplicated, LEN(@unduplicated), 1) <> SUBSTRING(@input, @i, 1)
        SET @unduplicated = @unduplicated + SUBSTRING(@input, @i, 1) ;
      SET @i = @i + 1;
    END
  END  
  SELECT @unduplicated AS unduplicated;

Resultado:

unduplicated 
ABCDEFBXYZSWNT
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top