トップページに戻る
次のSQLパズルへ
前のSQLパズルへ
10-183 範囲指定して、乱数を取得
SQLパズル
0.01から9999.99までの乱数を取得する。
SQL
--■■■dbms_random.valueで範囲指定する方法■■■
select round(dbms_random.value(0.01, 9999.98),2) as Val
from dual;
--■■■乱数でソートする方法■■■
select distinct First_Value(0.00 + RowNum*0.01) over(order by dbms_random.value) as Val
from (select 1 from all_objects where RowNum <= 1000),
(select 1 from all_objects where RowNum <= 1000)
where RowNum <= 999999;
解説
dbms_random.valueで範囲指定する方法は、9999.99だけ抽出する確率が低くなります。
DBMS_RANDOM
>ランダムなOracleの数値xを取得できます。このxはlow以上high未満です。
DBMS_RANDOM(英語)
>you can get a random Oracle number x, where x is greater than or equal to low and less than high.
■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■
0から9999.99までを取得するのであれば、
各桁をランダムにするという考え方が使えます。
select "Number1000" *1000+
"Number100" *100+
"Number10" *10+
"Number1" +
"Number0.1" /10+
"Number0.01" /100 as Val
from (select distinct
First_Value(RowNum-1) over(order by dbms_random.value(1,2)) as "Number1000",
First_Value(RowNum-1) over(order by dbms_random.value(2,3)) as "Number100",
First_Value(RowNum-1) over(order by dbms_random.value(3,4)) as "Number10",
First_Value(RowNum-1) over(order by dbms_random.value(4,5)) as "Number1",
First_Value(RowNum-1) over(order by dbms_random.value(5,6)) as "Number0.1",
First_Value(RowNum-1) over(order by dbms_random.value(6,7)) as "Number0.01"
from all_objects
where RowNum <= 10);