sql >> Base de Datos >  >> RDS >> Oracle

El uso de select en ELSE de una instrucción CASE me da ORA-00937:no es una función de grupo de un solo grupo

Tomando un enfoque ligeramente diferente, pero parece funcionar. En lugar de usar mayúsculas y minúsculas y hacer un conteo, simplemente verifique si el agregado es nulo (coalesce devuelve el primer valor no nulo en una serie) y si lo es, sustituya su mensaje. Esto evita una agrupación de segundo nivel que no creo que sea necesaria.

Lástima que listagg no admita distinciones dentro del agregado también; podríamos evitar la vista en línea.

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

Esto tiene la sobrecarga en el sentido de que intenta generar una lista de usuarios que la declaración de su caso puede estar intentando provocar un cortocircuito. Sin embargo, si no hay registros en la sesión V$, la distinción de selección debería ser rápida.

Aunque, para ser honesto, no estoy seguro de por qué tenemos que hacer esto. Nulo en la lista es generalmente una respuesta adecuada que indica que no hay usuarios. y la interfaz de usuario manejaría nulo, lo que significa que no hay usuarios.

Incluso puede ser más rápido si agregamos la cláusula where a la vista en línea.

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