Função SQL Server para eliminar caracteres replicados
-
23-09-2019 - |
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