sql >> Base de Datos >  >> RDS >> Sqlserver

Conversión de base múltiple:uso de todas las combinaciones para el acortador de URL

Logré hacer la conversión. Lo complicado es que no es solo una conversión de base mixta, la base más alta del primer carácter también afecta los valores de los códigos más largos.

Empecé con un caso más fácil; códigos de base 10. Vi que el rango de dos dígitos tiene 10 códigos extra, el rango de tres dígitos tiene 100 códigos extra, y así sucesivamente:

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

Entonces, el valor del primer carácter en el código no es solo la base elevada a la posición, sino que también tiene un desplazamiento.

Después de aplicar esto a la codificación base-62, terminé con esto:

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