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