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

Použití select v ELSE příkazu CASE mi dává ORA-00937:není to skupinová funkce jedné skupiny

Je to trochu jiný přístup, ale zdá se, že to funguje. Namísto psaní velkých a malých písmen a počítání jednoduše zkontrolujte, zda je agregace nulová (sloučení vrátí první nenulovou hodnotu v řadě) a zda je nahrazena vaší zprávou. Tím se vyhneme seskupení 2. úrovně, o kterém si nemyslím, že je potřeba.

Škoda, že listagg nepodporuje odlišné i v rámci agregátu; mohli bychom se vyhnout inline zobrazení.

SELECT coalesce(listagg(A.osuser, ', ') within group (order by A.osuser), 
                'There are no users connected') as userList
FROM (select distinct osuser from v$session) A
WHERE A.osuser!= 'SYSTEM' and A.osuser not like 'VMCONFTEST%'

To má režii v tom, že se pokouší vygenerovat seznam uživatelů, které se vaše prohlášení o případu může pokoušet zkratovat. Pokud však ve V$session nejsou žádné záznamy, výběr by měl být rychlý.

I když abych byl upřímný, nejsem si jistý, proč to musíme udělat. Null v seznamu je obecně adekvátní odpověď označující žádné uživatele. a uživatelské rozhraní by zvládlo hodnotu null, což znamená žádní uživatelé.

Může být dokonce rychlejší, pokud do inline zobrazení přidáme klauzuli where..

SELECT coalesce(listagg(A.osuser, ', ') within group (order by A.osuser), 
                'There are no users connected') as userList
FROM (SELECT distinct osuser 
      FROM v$session
      WHERE A.osuser!= 'SYSTEM' 
        and A.osuser not like 'VMCONFTEST%') A


  1. Dostávám mnoho vybraných @@session.tx_read_only, udělal by jeden totéž?

  2. Jak změnit webový port v EBS 12.2

  3. MYSQL zobrazuje nesprávné řádky při použití GROUP BY

  4. Převod se nezdařil při převodu hodnoty varchar v příkazu case