Hier ist ein Weg - quasi-zufälliges Generieren der Strings (mithilfe von ora_hash
um den Trick zu machen), und zwar auf eine perfekt deterministische, reproduzierbare Weise. Wenn Sie andere (aber ähnliche) Ergebnisse erhalten möchten, verwenden Sie das dritte Argument für ora_hash
um einen anderen Startwert als den Standardwert (der 0 ist) bereitzustellen. Wenn Sie jedes Mal andere Ergebnisse wünschen, geben Sie ein dbms_random.value()
an Wert als Samen; dies erfordert immer noch, dass nur ein "zufälliger" Wert für die gesamte Abfrage generiert wird. Sie können auch mit der Obergrenze spielen (in meinem Beispiel 280), um mehr oder weniger null
zu erhalten (und kürzere vs. längere kommaseparierte Strings im Allgemeinen).
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