sql >> Base de Datos >  >> RDS >> Oracle

Oracle SQL genera salida aleatoria con listaggs

Aquí hay una forma:generar las cadenas de forma casi aleatoria (usando ora_hash para hacer el truco), mientras que de una manera perfectamente determinista y reproducible. Si desea obtener resultados diferentes (pero similares), use el tercer argumento para ora_hash para proporcionar una semilla diferente de la predeterminada (que es 0). Si desea resultados diferentes cada vez, proporcione un dbms_random.value() valor como la semilla; esto aún requerirá que se genere solo un valor "aleatorio" para toda la consulta. También puedes jugar con el límite superior (en mi ejemplo, 280) para obtener más o menos null (y cadenas separadas por comas más cortas frente a cadenas más largas, en general).

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