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

Conversion multi-base - en utilisant toutes les combinaisons pour le raccourcisseur d'URL

J'ai réussi à faire la conversion. La difficulté est qu'il ne s'agit pas seulement d'une conversion de base mixte, la base supérieure du premier caractère affecte également les valeurs des codes plus longs.

J'ai commencé avec un cas plus facile; codes en base 10. J'ai vu que la plage à deux chiffres a 10 codes supplémentaires, la plage à trois chiffres a 100 codes supplémentaires, et ainsi de suite :

0 - 9        : '0' - '9'
10 - 109     : '00' - '99'
110 - 1109   : '000' - '999'
1110 - 11109 : '0000' - '9999'

Ainsi, la valeur du premier caractère du code n'est pas seulement la base élevée à la position, mais elle a également un décalage.

Après avoir appliqué ceci à l'encodage base-62, voici ce que j'ai obtenu :

create function tiny_Encode(@UrlId int) returns varchar(10)
as
begin

  declare
    @Chars varchar(62),
    @Code varchar(10),
    @Value int,
    @Adder int

  set @Chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
  if (@UrlId < 63) begin
    set @Code = substring(@Chars, @UrlId, 1)
  end else begin
    set @UrlId = @UrlId - 1
    set @Value = 62
    set @Adder = 0
    while (@UrlId >= @Value * 63 + @Adder) begin
      set @Adder = @Adder + @Value
      set @Value = @Value * 62
    end
    set @Code = substring(@Chars, (@UrlId - @Adder) / @Value, 1)
    set @UrlId = ((@UrlId - @Adder) % @Value)
    while (@Value > 1) begin
      set @Value = @Value / 62
      set @Code = @Code + substring(@Chars, @UrlId / @Value + 1, 1)
      set @UrlId = @UrlId % @Value
    end
  end
  return @Code

end