sql >> Database >  >> RDS >> Sqlserver

Multi-base conversie - alle combinaties gebruiken voor URL-verkorter

Ik heb de conversie kunnen maken. Het lastige is dat het niet alleen een conversie met gemengde grondtalen is, de hogere grondtal van het eerste teken heeft ook invloed op de waarden van langere codes.

Ik begon met een eenvoudiger geval; basis-10-codes. Ik zag dat het tweecijferige bereik 10 extra codes heeft, het driecijferige bereik 100 extra codes, enzovoort:

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

De waarde van het eerste teken in de code is dus niet alleen de basis die naar de positie wordt verhoogd, maar heeft ook een offset.

Nadat ik dit had toegepast op de base-62-codering, kreeg ik dit:

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



  1. kan profielfoto niet bijwerken met varbinary

  2. SQLite Like()-functie met voorbeelden

  3. Oneindig scrollen Alle items tegelijk laden?

  4. SQLite Self-Join