Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Removendo caracteres duplicados repetidos


Isso funciona para strings que são exclusivamente vírgulas ou têm até 398 vírgulas contíguas.
 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    

Adicione potências extras de 2 no topo se precisar de mais ou remova do topo se precisar de menos. Os comentários por cada etapa indicam o menor número que esta etapa não irá lidar com sucesso.

Todas as linhas de comentários estão neste 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

Então, para estender a série para cima com outro REPLICATE(',',32),',') palco
D = 32 
R = 31
Q = 368 (399-31)
L = (368 * 32) + 31 = 11807

Então, isso lidaria com seções de vírgulas de até 11.806 caracteres.