funzione SQL Server per eliminare personaggi replicati
-
23-09-2019 - |
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