Как сгенерировать случайный вывод функции listaggs?
Eсть числовые значения (30, 31, 32, 33).
Как сгенерировать вывод (случайный), который может содержать отдельные значения из этого списка, их списки различной длины или NULL?
Что-то такое:
| id | val |
|---|---|
| 1 | 30, 31 |
| 2 | null |
| 3 | 32 |
| 4 | 33 |
| 5 | null |
| 6 | 31, 33 |
| 7 | null |
| 8 | 30 |
Свободный перевод вопроса Oracle SQL generate random output with listaggs от участника user15746603 [удалён]
Ответы (1 шт):
Ниже способ генерации строк псевдослучайным образом, но при этом он совершенно детерминирован и воспроизводим. Для этого используется функция ORA_HASH.
Если надо получить разные (но похожие) результаты, используйте третий аргумент ORA_HASH, чтобы задать seed, отличное от значения по умолчанию (=0). А если надо каждый раз получать разные результаты, в качестве seed задайте значение dbms_random.value(). В этом случае для всего запроса будет сгенерировано только одно случайное значение.
Также можно поиграться с верхней границей (в примере 2800), чтобы получить больше или меньше NULL и более короткие или длинные списки.
Запрос (на db<>fiddle):
with vals (value) as (
select * from sys.ODCINumberList (30, 31, 32, 33)
),
ids (id) AS (
select level from dual connect by level <= 8
)
select id, (
select listagg (
case when ora_hash ((id * value), 10000, 0) < 2800
then value end, ',') within group(order by value)
from vals) as vals
from ids;
Результат:
ID VALS
---------- ----------------
1 <null>
2 32,33
3 <null>
4 30,31,33
5 30,31,33
6 33
7 <null>
8 30