Med ett lite annorlunda tillvägagångssätt men det verkar fungera. Istället för att skifta och räkna, kontrollera helt enkelt om aggregatet är noll (sammansammans returnerar det första icke-nullvärdet i en serie) och om det är ersätt ditt meddelande. Detta undviker en gruppering på andra nivån som jag inte tror behövs.
Synd att listagg inte stöder distinkta inom aggregatet också; vi kunde undvika inline-vyn.
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%'
Detta har överheaden i det att det försöker generera en lista över användare som din fallbeskrivning kan försöka kortsluta. Men om det inte finns några poster i V$-sessionen bör markeringen vara snabb.
Även om jag ska vara ärlig vet jag inte varför vi behöver göra det här. Null i listan är i allmänhet ett adekvat svar som anger att inga användare är. och användargränssnittet skulle hantera null vilket betyder inga användare.
Kan till och med bli snabbare om vi fler where-klausulen till inlinevyn...
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