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

Conversione multibase:utilizzo di tutte le combinazioni per l'abbreviazione di URL

Sono riuscito a fare la conversione. La cosa difficile è che non si tratta solo di una conversione di base mista, la base più alta del primo carattere influisce anche sui valori di codici più lunghi.

Ho iniziato con un caso più semplice; codici base 10. Ho visto che l'intervallo a due cifre ha 10 codici extra, l'intervallo a tre cifre ha 100 codici extra e così via:

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

Quindi, il valore del primo carattere nel codice non è solo la base elevata alla posizione, ma ha anche un offset.

Dopo averlo applicato alla codifica base-62, questo è ciò che ho ottenuto:

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