Voici un moyen - générer les chaînes de manière quasi aléatoire (en utilisant ora_hash
faire l'affaire), tout en étant parfaitement déterministe et reproductible. Si vous souhaitez obtenir des résultats différents (mais similaires), utilisez le troisième argument de ora_hash
pour fournir une graine différente de celle par défaut (qui est 0). Si vous voulez des résultats différents à chaque fois, fournissez un dbms_random.value()
valeur comme graine; cela nécessitera toujours qu'une seule valeur "aléatoire" soit générée pour l'ensemble de la requête. Vous pouvez également jouer avec la borne supérieure (dans mon exemple, 280) pour obtenir plus ou moins de null
(et plus généralement des chaînes plus courtes ou plus longues séparées par des virgules).
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