Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Oracle SQL gera saída aleatória com listaggs


Aqui está uma maneira - gerando as strings quase aleatoriamente (usando ora_hash para fazer o truque), enquanto de uma forma perfeitamente determinística e reproduzível. Se você deseja obter resultados diferentes (mas semelhantes), use o terceiro argumento para ora_hash para fornecer uma semente diferente do padrão (que é 0). Se você quiser resultados diferentes todas as vezes, forneça um dbms_random.value() valor como a semente; isso ainda exigirá que apenas um valor "aleatório" seja gerado para toda a consulta. Você também pode jogar com o limite superior (no meu exemplo, 280) para obter mais ou menos null (e strings separadas por vírgulas mais curtas vs. mais longas, de forma mais geral).
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