Ecco un modo:generare le stringhe in modo quasi casuale (usando ora_hash
per fare il trucco), mentre in modo perfettamente deterministico e riproducibile. Se vuoi ottenere risultati diversi (ma simili), usa il terzo argomento per ora_hash
per fornire un seme diverso da quello predefinito (che è 0). Se desideri risultati diversi ogni volta, fornisci un dbms_random.value()
valore come il seme; ciò richiederà comunque la generazione di un solo valore "casuale" per l'intera query. Puoi anche giocare con il limite superiore (nel mio esempio, 280) per ottenere più o meno null
(e più in generale stringhe separate da virgole più brevi o più lunghe).
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