Oracle
 sql >> Database >  >> RDS >> Oracle

L'uso di select nell'ELSE di un'istruzione CASE mi dà ORA-00937:non una funzione di gruppo a gruppo singolo

Adottando un approccio leggermente diverso, ma sembra funzionare. Invece di eseguire il maiuscolo e il conteggio, controlla semplicemente se l'aggregato è nullo (coalesce restituisce il primo valore non nullo di una serie) e se lo è sostituisci il tuo messaggio. Questo evita un raggruppamento di 2° livello che non credo sia necessario.

Peccato che listagg non supporti anche i distinti all'interno dell'aggregato; potremmo evitare la visualizzazione in linea.

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%'

Questo ha il sovraccarico in quanto tenta di generare un elenco di utenti che l'istruzione del tuo caso potrebbe tentare di cortocircuitare. Tuttavia, se non ci sono record in V$session, la selezione distinta dovrebbe essere rapida.

Anche se ad essere onesto non sono sicuro del motivo per cui dobbiamo farlo. Null nell'elenco è generalmente una risposta adeguata che indica nessun utente. e l'interfaccia utente gestirebbe null, ovvero nessun utente.

Potrebbe anche essere più veloce se inseriamo di più la clausola where nella vista inline..

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