Ответ 1
Что-то вроде?
select t.*, round(dbms_random.value() * 8) + 1 from foo t;
Я хочу выбрать все строки таблицы, за которыми следует случайное число от 1 до 9:
select t.*, (select dbms_random.value(1,9) num from dual) as RandomNumber
from myTable t
Но случайное число одинаково от строки к строке, только отличное от каждого прогона запроса. Как сделать число отличным от строки к строке в одном и том же исполнении?
Что-то вроде?
select t.*, round(dbms_random.value() * 8) + 1 from foo t;
Сначала я подумал, что это сработает:
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
вам не нужен select … from dual
, просто напишите:
SELECT t.*, dbms_random.value(1,9) RandomNumber
FROM myTable t
Если вы просто используете раунд, то два конечных числа (1 и 9) будут встречаться реже, чтобы получить равномерное распределение целых чисел между 1 и 9, а затем:
SELECT MOD(Round(DBMS_RANDOM.Value(1, 99)), 9) + 1 FROM DUAL