トップページに戻る    次の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);