Oracle
 sql >> Base de données >  >> RDS >> Oracle

Oracle SQL génère une sortie aléatoire avec listaggs

Voici un moyen - générer les chaînes de manière quasi aléatoire (en utilisant ora_hash faire l'affaire), tout en étant parfaitement déterministe et reproductible. Si vous souhaitez obtenir des résultats différents (mais similaires), utilisez le troisième argument de ora_hash pour fournir une graine différente de celle par défaut (qui est 0). Si vous voulez des résultats différents à chaque fois, fournissez un dbms_random.value() valeur comme graine; cela nécessitera toujours qu'une seule valeur "aléatoire" soit générée pour l'ensemble de la requête. Vous pouvez également jouer avec la borne supérieure (dans mon exemple, 280) pour obtenir plus ou moins de null (et plus généralement des chaînes plus courtes ou plus longues séparées par des virgules).

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