我想选择一个表的所有行,后跟1到9之间的随机数:
select t.*, (select dbms_random.value(1,9) num from dual) as RandomNumber
from myTable t
但是随机数在行与行之间是相同的,只是与查询的每次运行不同。如何在同一执行中使行数不同?
答案 0 :(得分:38)
喜欢什么?
select t.*, round(dbms_random.value() * 8) + 1 from foo t;
编辑: 大卫指出这给出了1和9的不均匀分布。
正如他所指出的,以下内容提供了更好的分布:
select t.*, floor(dbms_random.value(1, 10)) from foo t;
答案 1 :(得分:15)
起初我认为这样可行:
select DBMS_Random.Value(1,9) output
from ...
但是,这不会产生均匀的输出值分布:
select output,
count(*)
from (
select round(dbms_random.value(1,9)) output
from dual
connect by level <= 1000000)
group by output
order by 1
1 62423
2 125302
3 125038
4 125207
5 124892
6 124235
7 124832
8 125514
9 62557
我认为原因很明显。
我建议使用类似的东西:
floor(dbms_random.value(1,10))
因此:
select output,
count(*)
from (
select floor(dbms_random.value(1,10)) output
from dual
connect by level <= 1000000)
group by output
order by 1
1 111038
2 110912
3 111155
4 111125
5 111084
6 111328
7 110873
8 111532
9 110953
答案 2 :(得分:6)
您不需要select … from dual
,只需写下:
SELECT t.*, dbms_random.value(1,9) RandomNumber
FROM myTable t
答案 3 :(得分:3)
如果你只是使用round,那么两个结束数字(1和9)将不那么频繁地出现,以便在1到9之间得到均匀的整数分布:
SELECT MOD(Round(DBMS_RANDOM.Value(1, 99)), 9) + 1 FROM DUAL