【问题标题】:Oracle 12c SQL Random String Digits Only Size 10Oracle 12c SQL 随机字符串仅数字大小 10
【发布时间】:2020-12-27 04:25:02
【问题描述】:

获取仅包含数字字符(数字)的 10 个字符的随机字符串的最简单方法是什么?下面的一个给出了类似的东西,但我也想得到带有左填充零的字符串。例如0000000020

SELECT LPAD(REPLACE(TO_CHAR(dbms_random.value(1, 9999999999)),'.',''),10,'0') randomnumstr 
  FROM dual;

【问题讨论】:

标签: sql oracle random


【解决方案1】:

这可能是一个较短的选择:

SELECT DECODE(val,0,val+1E-10,val) AS randomnumstr 
  FROM
  (SELECT SUBSTR(DBMS_RANDOM.VALUE(0, 1),-10) AS val
     FROM dual);  

它也可能包含前面的零并具有十位长度。 val 被生成为大于或等于0,并且严格小于1 (0<=val<1)。在这种情况下,val 等于 0,那么结果将是 0000000001

【讨论】:

  • 感谢您的回答。如果 DBMS_RANDOM.VALUE(0, 9) 根据文档返回 0,这将不起作用。可能是 SUBSTR(DBMS_RANDOM.VALUE(1, 9),-10)?
  • 嗨@blueolive。对于这两种情况(无论是(0,9) 还是(1,9)),都存在0000000000(十位数的零)的概率。你说的对。所以,我将间隔缩小到(0,1),对于零返回的情况,添加1E-10 以获得0000000001 而不是0000000000
  • 十位数的零字符串对我有用。感谢您抽出宝贵时间回答问题,Barbaros!
【解决方案2】:

把它分解成碎片......

select to_char(dbms_random.value(1, 10000000000), 'FM0000000000') from dual;

首先,dbms_random.value 将返回 [a,b) 范围内的数字,因此使用 1 作为开始,使用 10000000000 作为结束。这个数字永远不会等于 10000000000。

其次,使用带有FM0000000000 掩码的TO_CHARFM 删除为标志添加的填充。由于不包含小数点,随机数的小数部分会被截断。

DBMS_RANDOM.VALUE docs

现在测试一些文字以确保它有效:

select to_char(1.234, 'FM0000000000') from dual;

0000000001

select to_char(1234, 'FM0000000000') from dual;

0000001234

select to_char(1234567890, 'FM0000000000') from dual;

1234567890

-- Now make sure there are no spaces for the sign
select length(to_char(123, 'FM0000000000')) from dual;

10

【讨论】:

  • 感谢您的回答!这按预期工作。
猜你喜欢
  • 1970-01-01
  • 2014-07-23
  • 2018-01-14
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-08-14
  • 2015-02-20
  • 1970-01-01
相关资源
最近更新 更多