少し異なるアプローチを取りますが、機能しているように見えます。大文字と小文字を区別してカウントする代わりに、集計がnullであるかどうか(coalesceが一連の最初のnull以外の値を返す)、およびそれがメッセージの代わりになるかどうかを確認するだけです。これにより、必要とは思わない第2レベルのグループ化が回避されます。
あまりにも悪いlistaggは、アグリゲート内の個別化もサポートしていません。インラインビューを回避できます。
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%'
これには、caseステートメントが短絡しようとしている可能性のあるユーザーのリストを生成しようとするというオーバーヘッドがあります。ただし、V $ sessionにレコードがない場合は、選択をすばやく行う必要があります。
正直なところ、なぜこれを行う必要があるのかわかりません。リスト内のnullは、通常、ユーザーがいないことを示す適切な応答です。 UIはnullを処理し、ユーザーがいないことを意味します。
インラインビューにwhere句を追加すると、さらに高速になる可能性があります。
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