Aqui está uma maneira - gerando as strings quase aleatoriamente (usando
ora_hash
para fazer o truque), enquanto de uma forma perfeitamente determinística e reproduzível. Se você deseja obter resultados diferentes (mas semelhantes), use o terceiro argumento para ora_hash
para fornecer uma semente diferente do padrão (que é 0). Se você quiser resultados diferentes todas as vezes, forneça um dbms_random.value()
valor como a semente; isso ainda exigirá que apenas um valor "aleatório" seja gerado para toda a consulta. Você também pode jogar com o limite superior (no meu exemplo, 280) para obter mais ou menos null
(e strings separadas por vírgulas mais curtas vs. mais longas, de forma mais geral). 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