首页 > 解决方案 > 在表列 oracle 中混淆名称

问题描述

我的要求是为了混淆目的将 oracle 表中的名称混在一起,如下所示

规则

  1. 相同的记录不应具有相同的名称
  2. 应根据性别进行混编
  3. 逻辑应该是完全随机的

员工

ID 姓名 性别
1 彼得
2 帕斯卡
3 罗宾
4 斯蒂芬妮 F
5 艾莉亚 F

员工- 预期

ID 姓名 性别
1 罗宾
2 彼得
3 帕斯卡
4 艾莉亚 F
5 斯蒂芬妮 F

下面的链接中提到了我到目前为止所尝试的内容,但不知何故我无法修复它,因为数据可能以数百万计 http://sqlfiddle.com/#!4/460bda/5

标签: sqloracleoracle12cobfuscation

解决方案


您可以使用以下方法随机化每个性别中的名称row_number()

select e.*, e2.name as new_name
from (select e.*,
             row_number() over (partition by gender order by name) as seqnum
      from employee e
     ) e join
     (select e.*,
             row_number() over (partition by gender order by dbms_random.random()) as seqnum
      from employee e
     ) e2
     on e.gender = e2.gender and e.seqnum = e2.seqnum;

这并不能保证永远不会重复使用名称。事实上,考虑到其他限制,这是不可能的——一个性别可能只有一个名字。但是,这确实会随机分配名称,因此不太可能保持相同的名称。

如果您的姓名可以重复,请使用dense_rank()而不是row_number().

是一个 db<>fiddle。

您可以使用“转移”方法避免将名称映射回相同的名称。然而,这种转变是可以撤销的。以非常小的重新分配概率随机分配名称的解决方案可能更适合混淆。


推荐阅读