Här är ett sätt - generera strängarna kvasi-slumpmässigt (med ora_hash
att göra susen), samtidigt som det är på ett perfekt deterministiskt, reproducerbart sätt. Om du vill få olika (men liknande) resultat, använd det tredje argumentet för att ora_hash
för att tillhandahålla ett frö som skiljer sig från standardvärdet (som är 0). Om du vill ha olika resultat varje gång, ange en dbms_random.value()
värde som fröet; detta kräver fortfarande att bara ett "slumpmässigt" värde genereras för hela frågan. Du kan också spela med den övre gränsen (i mitt exempel, 280) för att få mer eller färre null
(och kortare kontra längre kommaseparerade strängar, mer allmänt).
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