Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Rimozione di caratteri duplicati ripetuti

Funziona per stringhe che sono esclusivamente virgole o hanno fino a 398 virgole contigue.

 SELECT 
     CASE 
         WHEN TargetString NOT LIKE '%[^,]%' 
             THEN '' /*The string is exclusively commas*/
         ELSE 
            REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TargetString,
            REPLICATE(',',16),','), /*399/16 = 24 remainder 15*/
            REPLICATE(',',8),','),  /* 39/ 8 =  4 remainder 7*/
            REPLICATE(',',4),','),  /* 11/ 4 =  2 remainder 3*/
            REPLICATE(',',2),','),  /*  5/ 2 =  2 remainder 1*/
            REPLICATE(',',2),',')   /*  3/ 2 =  1 remainder 1*/
         END
 FROM T    

Aggiungi poteri extra di 2 in alto se ne hai bisogno di più o rimuovi dall'alto se ne hai bisogno di meno. I commenti di ciascuna fase indicano il numero più piccolo che questa fase non gestirà con successo.

Tutte le righe di commento sono in questo formato

/*  L/D    =  Q remainder R */

D:    Corresponds to the length of the string generated by `REPLICATE`
R:    Is always D-1
Q+R:  Form L for the next step

Quindi per estendere la serie verso l'alto con un altro REPLICATE(',',32),',') fase

D = 32 
R = 31
Q = 368 (399-31)
L = (368 * 32) + 31 = 11807

Quindi tratterebbe sezioni di virgole fino a 11.806 caratteri.