VARCHAR 字段上 SQL 中的 Alberti 或 Caesar 密码以屏蔽数字
Alberti or Caesar cipher in SQL on VARCHAR field to mask number
我在 SAS 中使用了 Alberti 密码来屏蔽数字,这在不同长度上效果很好。但是,我在 Redshift SQL.
中执行相同的任务时遇到了问题
如果我有一个长度都相同的数字,我可以简单地使用子字符串的组合并挑选出 Frankenstein 一个屏蔽的数字。如果我的 COL1
是 123456789
,它会是这样的:
substring(col1,9,1)||substring(col1,2,2)||substring(acct_num_full,3,1)||...
但是,我试图屏蔽的列可能有 5-40 个字符,因此上面的示例不起作用。我已经尝试 lpad
和 rpad
来标准化长度,但它不适用于较短的数字。
有没有人有任何想法或在 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;
我在 SAS 中使用了 Alberti 密码来屏蔽数字,这在不同长度上效果很好。但是,我在 Redshift SQL.
中执行相同的任务时遇到了问题如果我有一个长度都相同的数字,我可以简单地使用子字符串的组合并挑选出 Frankenstein 一个屏蔽的数字。如果我的 COL1
是 123456789
,它会是这样的:
substring(col1,9,1)||substring(col1,2,2)||substring(acct_num_full,3,1)||...
但是,我试图屏蔽的列可能有 5-40 个字符,因此上面的示例不起作用。我已经尝试 lpad
和 rpad
来标准化长度,但它不适用于较短的数字。
有没有人有任何想法或在 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;