sql >> データベース >  >> RDS >> Sqlserver

マルチベース変換 - URL 短縮サービスのすべての組み合わせを使用

    変換に成功しました。注意が必要なことは、混合基数変換だけでなく、最初の文字の上位基数も長いコードの値に影響することです。

    私はより簡単なケースから始めました。 base-10 コード。 2 桁の範囲には 10 個の追加コードがあり、3 桁の範囲には 100 個の追加コードがあることがわかりました。

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

    そのため、コード内の最初の文字の値は、その位置まで上げられた基数だけでなく、オフセットも持っています。

    これを base-62 エンコーディングに適用すると、最終的に次のようになりました:

    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. Accessでクロス集計クエリウィザードを使用する方法

    2. SQL Serverインデックスの後方スキャン:理解とパフォーマンスの調整

    3. 条件が満たされていない場合に置換変数を無視する

    4. djangoモデルの大きな整数フィールド