Oracle
 sql >> Database >  >> RDS >> Oracle

Oracle SQL genera output casuale con listaggs

Ecco un modo:generare le stringhe in modo quasi casuale (usando ora_hash per fare il trucco), mentre in modo perfettamente deterministico e riproducibile. Se vuoi ottenere risultati diversi (ma simili), usa il terzo argomento per ora_hash per fornire un seme diverso da quello predefinito (che è 0). Se desideri risultati diversi ogni volta, fornisci un dbms_random.value() valore come il seme; ciò richiederà comunque la generazione di un solo valore "casuale" per l'intera query. Puoi anche giocare con il limite superiore (nel mio esempio, 280) per ottenere più o meno null (e più in generale stringhe separate da virgole più brevi o più lunghe).

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