Her er en måde - generering af strengene kvasi-tilfældigt (ved hjælp af ora_hash
at gøre tricket), mens det er på en perfekt deterministisk, reproducerbar måde. Hvis du ønsker at få forskellige (men lignende) resultater, skal du bruge det tredje argument til ora_hash
for at give en anden frø end standarden (som er 0). Hvis du vil have forskellige resultater hver gang, skal du angive en dbms_random.value()
værdi som frø; dette vil stadig kræve, at der kun genereres én "tilfældig" værdi for hele forespørgslen. Du kan også spille med den øvre grænse (i mit eksempel 280) for at få mere eller færre null
(og kortere vs. længere kommaseparerede strenge, mere generelt).
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