Đây là một cách - tạo các chuỗi gần như ngẫu nhiên (sử dụng ora_hash
để thực hiện thủ thuật), trong khi theo một cách hoàn toàn xác định, có thể tái tạo. Nếu bạn muốn nhận được các kết quả khác nhau (nhưng tương tự), hãy sử dụng đối số thứ ba cho ora_hash
để cung cấp một hạt giống khác với mặc định (là 0). Nếu bạn muốn các kết quả khác nhau mọi lúc, hãy cung cấp dbms_random.value()
giá trị như hạt giống; điều này sẽ vẫn chỉ yêu cầu một giá trị "ngẫu nhiên" được tạo cho toàn bộ truy vấn. Bạn cũng có thể chơi với giới hạn trên (trong ví dụ của tôi là 280) để nhận được nhiều hơn hoặc ít hơn null
(và các chuỗi ngắn hơn so với các chuỗi được phân tách bằng dấu phẩy dài hơn, nói chung hơn).
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