我有一种情况,我必须用表中的数据屏蔽数据
假设我有一张桌子pip install tzlocal
student_details(ID, CODE, NAME)
我希望输出为
1 A XYZ
2 A 123
3 A QWERTY
我希望该名称位于该表的名称列表内 对于相同的ID,我想要表中的其他名称。
1 A QWERTY
2 A XYZ
3 A 123
给出了一些不在列表中的随机名称。
有人可以帮我吗?
答案 0 :(得分:0)
这里是一个选择:使用ID
分析函数重新计算ROW_NUMBER
值,该函数按哈希值对连接的name
,code
和id
列中的行进行排序(例如,您可以选择其他内容)。
SQL> with test (id, code, name) as
2 (select 1, 'A', 'XYZ' from dual union all
3 select 2, 'A', '123' from dual union all
4 select 3, 'A', 'QUERTY' from dual
5 ),
6 inter as
7 (select row_number() over (order by ora_hash(name || code || id)) id,
8 code, name
9 from test
10 )
11 select t.id, t.code, i.name
12 from test t join inter i on t.id = i.id;
ID C NAME
---------- - ------
1 A XYZ
2 A QUERTY
3 A 123
SQL>
答案 1 :(得分:0)
如果您打算置换表中的所选列,并使表的其余部分保持不变,则可以对键置换表使用联接。
假设您的数据如下:
ID CODE NAME
---------- ---- ------
1001 A XYZ
1002 B 123
1004 C QUERTY
1005 A FOO
请注意,PK
是不连续,这是一般情况。如果您拥有从1开始的PK连续序列,则甚至可以简化解决方案(如其他答案中所建议)。
首先让我们定义排列表,以随机顺序为每个PK
分配一个新密钥。
create table PERM as
with rn as (
select
id,
row_number() over (order by id) rn,
row_number() over (order by dbms_random.value) rn_new
from student)
select a.ID, b.ID ID_NEW
from rn a
join rn b
on a.RN = b.RN_NEW;
ID ID_NEW
---------- ----------
1001 1004
1002 1001
1004 1005
1005 1002
查询定义了两个row_number
序列,第一个以PK
的顺序,第二个以随机顺序。最后的联接将获得原始ID
和新的(排列的)select a.ID, a.code, b.name
from student a
join PERM p on a.id = p.id
join student b on p.id_new = b.id
order by a.id;
ID CODE NAME
---------- ---- ------
1001 A QUERTY
1002 B XYZ
1004 C FOO
1005 A 123
。
现在要进行置换选定的列很容易,因为两次表之间使用 permutation 进行联接,然后从中选择 preserved 列即可第一个表,第二个表的 permuted 列。
>>> tab1
Value Sp_name
0 None ROOT
1 0.066 Genus_1_sp1
2 0.1044 Genus_2_sp1
3 0.0708 EDGE
4 0.0586 Genus_3_sp1
5 0.0083 Genus_4_sp1
只要保留置换表,您就可以重建以前的状态,如果将其删除,则无法获取原始数据。