sql - 在表列 oracle 中混淆名称
问题描述
我的要求是为了混淆目的将 oracle 表中的名称混在一起,如下所示
规则
- 相同的记录不应具有相同的名称
- 应根据性别进行混编
- 逻辑应该是完全随机的
表员工
ID | 姓名 | 性别 |
---|---|---|
1 | 彼得 | 米 |
2 | 帕斯卡 | 米 |
3 | 罗宾 | 米 |
4 | 斯蒂芬妮 | F |
5 | 艾莉亚 | F |
表员工- 预期
ID | 姓名 | 性别 |
---|---|---|
1 | 罗宾 | 米 |
2 | 彼得 | 米 |
3 | 帕斯卡 | 米 |
4 | 艾莉亚 | F |
5 | 斯蒂芬妮 | F |
下面的链接中提到了我到目前为止所尝试的内容,但不知何故我无法修复它,因为数据可能以数百万计 http://sqlfiddle.com/#!4/460bda/5
解决方案
您可以使用以下方法随机化每个性别中的名称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。
您可以使用“转移”方法避免将名称映射回相同的名称。然而,这种转变是可以撤销的。以非常小的重新分配概率随机分配名称的解决方案可能更适合混淆。
推荐阅读
- javascript - Angularjs - 输入的动态名称
- javascript - 如何向文件数组中的对象添加值?
- java - 从一个系统执行 jar 文件时通信链接失败
- javascript - 单击按钮下载 Excel (phpExcel)
- alexa - Alexa 记录用户的话语
- json - 映射 json 数据/对象颤动
- c - 为什么不允许我使用结构的成员?
- python - 如何在数据框上应用肘法
- mysql - mysql-match-is-not-giving-proper-result-when-searching-a-word-with-single-quote
- .net - 对需要 Docker 的 .NET Core 应用程序进行单元测试