Ето един начин - генериране на низовете квазислучайно (с помощта на ora_hash
за да направите трика), докато по съвършено детерминистичен, възпроизводим начин. Ако искате да получите различни (но подобни) резултати, използвайте третия аргумент на ora_hash
за да предостави семе, различно от по подразбиране (което е 0). Ако искате различни резултати всеки път, осигурете dbms_random.value()
стойност като семето; това пак ще изисква само една "произволна" стойност да бъде генерирана за цялата заявка. Можете също да играете с горната граница (в моя пример 280), за да получите повече или по-малко null
(и по-кратки срещу по-дълги низове, разделени със запетая, по-общо).
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