Oto sposób - generowanie ciągów quasi-losowo (za pomocą ora_hash
załatwić sprawę), a jednocześnie w doskonale deterministyczny, powtarzalny sposób. Jeśli chcesz uzyskać różne (ale podobne) wyniki, użyj trzeciego argumentu ora_hash
aby zapewnić ziarno inne niż domyślne (czyli 0). Jeśli chcesz za każdym razem uzyskać inne wyniki, podaj dbms_random.value()
wartość jako ziarno; to nadal będzie wymagało wygenerowania tylko jednej „losowej” wartości dla całego zapytania. Możesz także grać z górną granicą (w moim przykładzie 280), aby uzyskać więcej lub mniej null
(i ogólniej krótsze i dłuższe ciągi oddzielone przecinkami).
WITH data ( value ) AS (
SELECT 30 FROM DUAL UNION ALL
SELECT 31 FROM DUAL UNION ALL
SELECT 32 FROM DUAL UNION ALL
SELECT 33 FROM DUAL
),
ids ( id ) AS (
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL <= 8
)
select id,
( select listagg(case when ora_hash(id * value, 1000) < 280
then value end, ',')
within group(order by value)
from data
) as vals
from ids
;
ID VALS
-- ---------------
1 33
2 32
3
4 30,32
5 30,31
6 32
7
8