VARCHAR 字段上 SQL 中的 Alberti 或 Caesar 密码以屏蔽数字

Alberti or Caesar cipher in SQL on VARCHAR field to mask number

我在 SAS 中使用了 Alberti 密码来屏蔽数字,这在不同长度上效果很好。但是,我在 Redshift SQL.

中执行相同的任务时遇到了问题

如果我有一个长度都相同的数字,我可以简单地使用子字符串的组合并挑选出 Frankenstein 一个屏蔽的数字。如果我的 COL1123456789,它会是这样的:

substring(col1,9,1)||substring(col1,2,2)||substring(acct_num_full,3,1)||...

但是,我试图屏蔽的列可能有 5-40 个字符,因此上面的示例不起作用。我已经尝试 lpadrpad 来标准化长度,但它不适用于较短的数字。

有没有人有任何想法或在 SQL 中对可变字符列进行过 Alberti 或 Caesar 加密?我需要一个可以逆转的算法,这样我就可以解密了。

我能够使用 SAS 创建一个 work-around,它允许我使用上面描述的一系列 substring 技术将输出复制并粘贴到我的 SQL 语句中陈述:

/* create scaffold of column lengths */
data temp1; 
    do j=5 to 40;
        output;
    end;
run;

/* create SQL case text and randomize order of substring syntax */
data temp2; set temp1;
    do i=1 to j;
        str="substring(col1,"||strip(put(i,best.))||",1)";
        u = rand("Uniform");
        output;
    end;
run;

/* sort of column length of randomized order var */
proc sort data = temp2;
    by j u;
run;

/* put into wide format */
proc transpose data = temp2 out=wide;
    by j;
    var str;
run;

/* concatenate all SQL substring statements */
data wide1; set wide;
    format str 00.;
    str="when length(col1)="||strip(put(j,best.))||" then "||catx("||", of col:);
    keep str;
run;

/* output as a text file and copy and paste into your SQL select staement between case ... end */

translate() 函数可以执行字符替换 - https://docs.aws.amazon.com/redshift/latest/dg/r_TRANSLATE.html

只需提供凯撒密码作为 chars_to_replace 和 chars_to_substitute 字符串。

===========================================

例如执行来自维基百科的凯撒密码示例 - https://en.wikipedia.org/wiki/Caesar_cipher

select 'THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG'::text as pt
  into foo;

select pt,
 translate(pt,
           'ABCDEFGHIJKLMNOPQRSTUVWXYZ',
           'XYZABCDEFGHIJKLMNOPQRSTUVW') as ct;