Question

Je me demande s'il existe un moyen simple et efficace dans SQL Server 2005 pour éliminer les caractères répliquées dans une chaîne. Comme la conversion

'ABBBCDEEFFFFG' to 'ABCDEFG'

Il suce vraiment que SQL Server dispose d'une telle bibliothèque de chaîne pauvre et pas prêt à utiliser la fonction regexp ...

Pas de solution correcte

Autres conseils

Vous pouvez utiliser la fonctionnalité CLR intégrée dans SQL Server 2005/2008 pour obtenir ce fait par le code .NET.

MSDN Magazine écrit à ce sujet dans leur Février 2007 numéro .

Si ce n'est pas une solution acceptable, est une UDF qui fera la même chose, l'esprit que vous cela est de deux ordres de grandeur plus lent que la solution CLR.

YMMV. Cela semble fonctionner pour votre chaîne ci-dessus. Mais pas 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)

Je sais que sur la solution CLR, mais comme je le disais, je ne suis ni responsable, ni autorisé à le mettre en œuvre dans le DB de question.

Pour ce problème particulier, j'ai décidé d'écrire une boucle très simple et un peu stupide. Je crains que ce sera ... Je veux pas être assez rapide pour des millions de disques, mais de toute façon que je pouvais faire ce genre de choses dans la couche d'application, mais je suis lié à T-SQL ici ..

  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;

Résultat:

unduplicated 
ABCDEFBXYZSWNT
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top