Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Suppression des caractères en double répétés

Cela fonctionne pour les chaînes qui sont exclusivement des virgules ou qui ont jusqu'à 398 virgules contiguës.

 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    

Ajoutez des puissances supplémentaires de 2 en haut si vous avez besoin de plus ou retirez du haut si vous en avez besoin de moins. Les commentaires de chaque étape indiquent le plus petit nombre que cette étape ne traitera pas avec succès.

Toutes les lignes de commentaires sont dans ce format

/*  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

Donc pour étendre la série vers le haut avec un autre REPLICATE(',',32),',') étape

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

Cela traiterait donc des sections de virgules jusqu'à 11 806 caractères.