Aquí hay una forma:generar las cadenas de forma casi aleatoria (usando ora_hash
para hacer el truco), mientras que de una manera perfectamente determinista y reproducible. Si desea obtener resultados diferentes (pero similares), use el tercer argumento para ora_hash
para proporcionar una semilla diferente de la predeterminada (que es 0). Si desea resultados diferentes cada vez, proporcione un dbms_random.value()
valor como la semilla; esto aún requerirá que se genere solo un valor "aleatorio" para toda la consulta. También puedes jugar con el límite superior (en mi ejemplo, 280) para obtener más o menos null
(y cadenas separadas por comas más cortas frente a cadenas más largas, en general).
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