sql >> Databáze >  >> RDS >> Oracle

Oracle SQL generuje náhodný výstup pomocí listaggs

Zde je způsob – kvazináhodné generování řetězců (pomocí ora_hash udělat trik), a přitom dokonale deterministickým, reprodukovatelným způsobem. Pokud chcete získat odlišné (ale podobné) výsledky, použijte třetí argument ora_hash poskytnout seed odlišný od výchozího (který je 0). Pokud chcete pokaždé jiné výsledky, zadejte dbms_random.value() hodnota jako semeno; to bude stále vyžadovat vygenerování pouze jedné "náhodné" hodnoty pro celý dotaz. Můžete také hrát s horní hranicí (v mém příkladu 280), abyste získali více nebo méně null (a obecně kratší vs. delší řetězce oddělené čárkou).

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. Používejte relační databáze MySQL na Ubuntu 9.04 (Jaunty)

  2. SQLSTATE[42S01]:Základní tabulka nebo pohled již existuje:1050 Tabulka „platby“ již existuje (SQL:vytvořte tabulku „platby“

  3. Jak rozdělit objekt CLOB pomocí oddělovače , a :v Oracle do více záznamů

  4. MySQL Socket odmítá připojení po tisících po sobě jdoucích připojení