Oracle
 sql >> база данни >  >> RDS >> Oracle

Oracle SQL генерира случаен изход с listaggs

Ето един начин - генериране на низовете квазислучайно (с помощта на ora_hash за да направите трика), докато по съвършено детерминистичен, възпроизводим начин. Ако искате да получите различни (но подобни) резултати, използвайте третия аргумент на ora_hash за да предостави семе, различно от по подразбиране (което е 0). Ако искате различни резултати всеки път, осигурете dbms_random.value() стойност като семето; това пак ще изисква само една "произволна" стойност да бъде генерирана за цялата заявка. Можете също да играете с горната граница (в моя пример 280), за да получите повече или по-малко null (и по-кратки срещу по-дълги низове, разделени със запетая, по-общо).

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създадете разделена таблица на Oracle в SQLAlchemy?

  2. защо асоциативен масив, индексиран от VARCHAR2, не съхранява повече от 9 елемента

  3. Обяснение на оператора Oracle MINUS

  4. Копиране на данни от файл в CLOB в Oracle

  5. Използване на OracleParameter с C# TimeSpan - Литералът не съвпада