Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Usar select no ELSE de uma instrução CASE me dá ORA-00937:not a single-group group function


Tomando uma abordagem um pouco diferente, mas parece funcionar. Em vez de usar maiúsculas e minúsculas e fazer uma contagem, basta verificar se a agregação é nula (coalesce retorna o primeiro valor não nulo em uma série) e se é substituir sua mensagem. Isso evita um agrupamento de 2º nível que não acredito ser necessário.

Pena que o listagg também não suporta distinto dentro do agregado; poderíamos evitar a visualização em linha.
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%'

Isso tem a sobrecarga de tentar gerar uma lista de usuários que sua instrução de caso pode estar tentando causar um curto-circuito. No entanto, se não houver registros em V$session, o select distinct deve ser rápido.

Embora, para ser honesto, não tenha certeza de por que precisamos fazer isso. Nulo na lista geralmente é uma resposta adequada, indicando que não há usuários. e a interface do usuário lidaria com null, o que significa que não há usuários.

Pode até ser mais rápido se adicionarmos a cláusula where à visualização em linha.
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