これが方法です-文字列を準ランダムに生成します(ora_hash
を使用) トリックを行うために)、完全に決定論的で再現可能な方法で。異なる(ただし類似した)結果を取得する場合は、ora_hash
の3番目の引数を使用します デフォルト(0)とは異なるシードを提供します。毎回異なる結果が必要な場合は、dbms_random.value()
を指定してください シードとしての価値;これでも、クエリ全体に対して1つの「ランダム」値を生成する必要があります。上限(私の例では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