sql >> Database >  >> RDS >> Oracle

Oracle SQL genereert willekeurige uitvoer met listaggs

Hier is een manier om de strings quasi-willekeurig te genereren (met behulp van ora_hash om de slag te slaan), terwijl op een perfect deterministische, reproduceerbare manier. Als je andere (maar vergelijkbare) resultaten wilt krijgen, gebruik dan het derde argument om ora_hash om een ​​andere seed te geven dan de standaardwaarde (die 0 is). Als u elke keer andere resultaten wilt, geeft u een dbms_random.value() op waarde als het zaad; dit vereist nog steeds dat er slechts één "willekeurige" waarde wordt gegenereerd voor de hele query. Je kunt ook met de bovengrens spelen (in mijn voorbeeld 280) om meer of minder null te krijgen (en kortere vs. langere door komma's gescheiden tekenreeksen, meer in het algemeen).

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   


  1. Opgeslagen procedure blijft schijnbaar zonder uitleg hangen

  2. Wanneer u probeert een clob naar een Oracle-tabel te laden, laadt u te veel records

  3. Kan GI 12.1.0.2 en Segmentatiefout niet compileren

  4. Boom sorteren met een gematerialiseerd pad?