Zde je způsob – kvazináhodné generování řetězců (pomocí ora_hash
udělat trik), a přitom dokonale deterministickým, reprodukovatelným způsobem. Pokud chcete získat odlišné (ale podobné) výsledky, použijte třetí argument ora_hash
poskytnout seed odlišný od výchozího (který je 0). Pokud chcete pokaždé jiné výsledky, zadejte dbms_random.value()
hodnota jako semeno; to bude stále vyžadovat vygenerování pouze jedné "náhodné" hodnoty pro celý dotaz. Můžete také hrát s horní hranicí (v mém příkladu 280), abyste získali více nebo méně null
(a obecně kratší vs. delší řetězce oddělené čárkou).
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