Mengambil pendekatan yang sedikit berbeda tetapi tampaknya berhasil. Alih-alih menggunakan huruf besar dan menghitung, cukup periksa apakah agregatnya nol (gabungan mengembalikan nilai non-null pertama dalam rangkaian) dan jika itu adalah pengganti pesan Anda. Ini menghindari pengelompokan tingkat 2 yang menurut saya tidak diperlukan.
Sayang sekali listagg tidak mendukung perbedaan dalam agregat juga; kita bisa menghindari tampilan sebaris.
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%'
Ini memang memiliki overhead karena mencoba menghasilkan daftar pengguna yang pernyataan kasus Anda mungkin mencoba untuk korsleting. Namun jika tidak ada record dalam V$session, pemilihan perbedaan harus dilakukan dengan cepat.
Meskipun sejujurnya saya tidak yakin mengapa kita perlu melakukan ini. Null dalam daftar umumnya merupakan respons yang memadai yang menunjukkan tidak ada pengguna. dan UI akan menangani null yang berarti tidak ada pengguna.
Bahkan mungkin lebih cepat jika kita menambahkan klausa where ke tampilan inline..
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