Domanda

Mi chiedo se c'è un modo semplice ed efficace in SQL Server 2005 per eliminare i caratteri replicati in una stringa. Come la conversione

'ABBBCDEEFFFFG' to 'ABCDEFG'

Si fa davvero schifo che SQL Server ha una tale biblioteca stringa di poveri e non pronto per l'uso funzione regexp ...

Nessuna soluzione corretta

Altri suggerimenti

È possibile utilizzare la funzionalità CLR integrato in SQL Server 2005/2008 per ottenere questo fatto per codice .NET.

rivista MSDN ha scritto su di esso nella loro febbraio 2007 problema .

Se questa non è una soluzione accettabile, qui è un UDF che farà lo stesso, si badi bene questa è di circa due ordini di grandezza più lento rispetto alla soluzione CLR.

YMMV. Questo sembra funzionare per la stringa di cui sopra. Ma non 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)

Lo so circa la soluzione CLR, ma come ho detto, io non sono responsabile nè autorizzato per la sua attuazione nel DB di domanda.

Per questo particolare problema, ho deciso di scrivere un ciclo molto semplice e un pò sciocco. Temo che non sarà abbastanza veloce per milioni di dischi, ma comunque ... vorrei poter fare questa roba nel livello di applicazione, ma sono costretto a T-SQL qui ..

  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;

Risultato:

unduplicated 
ABCDEFBXYZSWNT
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top