Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle SQL generiert zufällige Ausgaben mit listaggs

Hier ist ein Weg - quasi-zufälliges Generieren der Strings (mithilfe von ora_hash um den Trick zu machen), und zwar auf eine perfekt deterministische, reproduzierbare Weise. Wenn Sie andere (aber ähnliche) Ergebnisse erhalten möchten, verwenden Sie das dritte Argument für ora_hash um einen anderen Startwert als den Standardwert (der 0 ist) bereitzustellen. Wenn Sie jedes Mal andere Ergebnisse wünschen, geben Sie ein dbms_random.value() an Wert als Samen; dies erfordert immer noch, dass nur ein "zufälliger" Wert für die gesamte Abfrage generiert wird. Sie können auch mit der Obergrenze spielen (in meinem Beispiel 280), um mehr oder weniger null zu erhalten (und kürzere vs. längere kommaseparierte Strings im Allgemeinen).

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