繁体   English   中英

具有动态列的Select语句中的DB2 SQL Scubbing数据

[英]DB2 SQL Scubbing Data in a Select Statement with dynamic columns

当然,我们有一台使用DB2的AS400,我需要将客户数据复制到新位置进行分析,但是必须对其进行清理以保护敏感信息。 我用大约30-40张桌子来做这个。 存储的过程越来越大…

无论如何,举一个简单的例子,说列的数据看起来像这样,在第二行中,是复制数据的结果:

Col1 | Col2 | Name                  | Sex |  SS#      | Age | Col7 | Col8 |
______________________________________________________________________________________________
 *   |  *   | Case when Sex = F,    |  *  | 111111111 |  *  |  *   |  *   |
            | then Jane Doe else    |
            | John Smith end        |

我的第一个尝试是进行大量插入然后更新,例如:

Insert into New_Table (Select * from Old_Table) ;
Update New_Table 
    set Name = ( Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’  End),
        SS# = 111111111 ;

问题在于,在一百万行,200列和表上的触发器上,insert语句速度很快,但更新速度却非常缓慢(以小时为单位)。 因此,在Stack的帮助下,我尝试了以下操作:

Insert into New_Table (Select Col1, Col2, 
    (Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’ End), 
    Sex, 111111111, Age, Col7, Col8)

像冠军一样工作-感谢团队堆栈!!

现在,我有另一个问题。 我有一个讨厌将代码列添加到这些表的开发人员的习惯,但我不在他们的团队中。 这些表有200列,当我遇到错误时,当我不得不查找新列时,修改可能会很有趣

因此,我试图提出一种方法来动态构建SQL语句并执行它,以便使列灵活。 当然,它将在语句中增加第二秒钟来构建它,但是与发生错误的工作时间相比,这是值得的。

我正在考虑使用类似列查找的方法,然后将其替换为我想要的列,构建SQL语句,然后执行一个Exec来调用它。 我只是想不出该怎么做。 至于构建语句,与查询的运行时间相比可能要花费一些时间。 例如,我可以使用以下方法拉列:

Select COLUMN_NAME from Sysibm.columns where tbname = 'old_table' AND table_schema = ‘MySchema’.

也许我可以将其放入变量中,然后搜索我知道的列(名称,ss#)并替换它们,然后构建一个SQL语句并执行它? 上面的列的select语句的结果虽然不太适合我需要的逗号分隔列表。 据我所知。

有人在想吗?

提前致谢。

这个:
Insert into New_Table (Select * from Old_Table)

生产代码中绝不是一个好主意。 您应该始终明确列出所需的列。

Insert into 
New_Table (Col1, Col2, Name, Sex, SS#, Age, Col7, Col8)
(Select Col1, Col2, 
    (Case when Sex = ‘F’ then ‘Jane Doe’ else ‘John Smith’ End), 
    Sex, 111111111, Age, Col7, Col8)

添加到表中的任何新列均应具有适当的默认值。 现在,添加列时您的过程不会中断。

当然,清理后的数据将具有新列的默认值,这可能会或可能不会出现问题。 因此,复制数据是一个事实,它证明了在生产中永远不要使用SELECT *的规则。

您使用syscolumns的想法很不错,还有List Fields(QUSLFLD)API 您将必须一次循环建立一列以逗号分隔的列表。

如果是我,我会建立两个列表。 一种用于我不需要擦洗的列,一种用于要擦洗的列。 同时,您构建替换选择文本。 这将使您的语句像这样构建:

wSQL = 'insert into new_table (' + wNonSrub + ',' + wSrub + ')'
        + ' (select ' + wNonScub + ',' + wReplacement 
        + ' from old_table' + ')';

另一个可能的想法...在应该具有清理后的数据的表上插入一个在Insert / Update之前的触发器。 该触发器可以在将数据写入表之前清除数据。 老实说,我最喜欢这个主意。 即使有人手动复制数据而不使用您正在构建的过程,也可以确保清除数据。

加快AS400上的插入速度 您可能在要插入记录的表上建立了许多逻辑文件。 将这些逻辑文件更改为REBLD(* DELAY)

CHGLF   mylib/mylogicalfile   rebld(*delay)

唯一的副作用是第一人称,并且在任何给定的一天中只有第一个打开文件的人可能需要等待几秒钟,才能重建访问路径。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM