Hier is een manier om de strings quasi-willekeurig te genereren (met behulp van ora_hash
om de slag te slaan), terwijl op een perfect deterministische, reproduceerbare manier. Als je andere (maar vergelijkbare) resultaten wilt krijgen, gebruik dan het derde argument om ora_hash
om een andere seed te geven dan de standaardwaarde (die 0 is). Als u elke keer andere resultaten wilt, geeft u een dbms_random.value()
op waarde als het zaad; dit vereist nog steeds dat er slechts één "willekeurige" waarde wordt gegenereerd voor de hele query. Je kunt ook met de bovengrens spelen (in mijn voorbeeld 280) om meer of minder null
te krijgen (en kortere vs. langere door komma's gescheiden tekenreeksen, meer in het algemeen).
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