Przyjmuję nieco inne podejście, ale wygląda na to, że działa.Zamiast wielkości liter i zliczania, po prostu sprawdź, czy agregacja ma wartość null (coalesce zwraca pierwszą niezerową wartość w serii) i czy zastępuje wiadomość. Pozwala to uniknąć grupowania drugiego poziomu, które moim zdaniem nie jest potrzebne.
Szkoda, że listagg również nie obsługuje wyrazistości w agregacie; moglibyśmy uniknąć widoku wbudowanego.
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%'
Ma to narzut, ponieważ próbuje wygenerować listę użytkowników, których instrukcja case może próbować skrócić. Jeśli jednak w sesji V$ nie ma żadnych rekordów, wybór wyróżnienia powinien być szybki.
Chociaż szczerze mówiąc, nie jestem pewien, dlaczego musimy to robić. Null na liście jest zazwyczaj odpowiednią odpowiedzią wskazującą na brak użytkowników. a interfejs użytkownika obsłuży wartość null, co oznacza brak użytkowników.
Może być nawet szybciej, jeśli zastosujemy klauzulę WHERE do widoku wbudowanego.
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