用随机值替换原始数据(Oracle)

问题描述 投票:0回答:1

进入tableA.Names我得到数据:

83601 Thomas Levy
Adam Jonson

我需要用一些随机数据替换原始数据。我可以使用:

dbms_random.string('a',10) string.

结果是:

OflRDIBSoN

如何做到这一点,结果将是这样的:

45618 ERGHNYU IULB.

首先它应该计算值:

83601 - 5 letter
Thomas - 6 letter
Levy - 4 letter

并且喜欢

dbms_random.string('a',5) + dbms_random.string('a',6) + dbms_random.string('a',4)

database oracle random replace oracle19c
1个回答
0
投票

一种选择是将

names
拆分为单独的单词,计算它们的长度并根据该长度获取随机值。

示例显示了整个 CTE,以及我提到的所有部分,以便您可以从中选择所有内容并查看发生了什么。最终查询返回期望的结果。

样本数据:

SQL> with tablea (names) as
  2  (select '83601 Thomas Levy' from dual union all
  3   select '12345 Adam Jonson' from dual
  4  ),

将名称拆分为单词,计算它们的长度:

  5  temp as
  6    (select names,
  7       column_value rn,
  8       regexp_substr(names, '[^ ]+', 1, column_value) str,
  9       length(regexp_substr(names, '[^ ]+', 1, column_value)) len
 10     from tablea cross join
 11       table(cast(multiset(select level from dual
 12                           connect by level <= regexp_count(names, ' ') + 1
 13                          ) as sys.odcinumberlist))
 14    )

最后,获取随机字符串并将它们聚合回来形成结果:

 15  select names,
 16    listagg(dbms_random.string('a', len), ' ') within group (order by names, rn) result
 17  from temp
 18  group by names;

NAMES             RESULT
----------------- ----------------------------------------
12345 Adam Jonson TeKeJ PWbH UMYsfP
83601 Thomas Levy cLDDb ewyFap dXpc

SQL>
© www.soinside.com 2019 - 2024. All rights reserved.