Tager en lidt anden tilgang, men det ser ud til at virke. I stedet for at skrive store og små bogstaver og lave en optælling, skal du blot kontrollere, om aggregatet er nul (sammensmeltning returnerer den første ikke-nul værdi i en serie), og om det er erstatning for din besked. Dette undgår en gruppering på 2. niveau, som jeg ikke mener er nødvendig.
Ærgerligt at listagg ikke også understøtter distinkt inden for aggregatet; vi kunne undgå den inline-visning.
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%'
Dette har den overhead, at den forsøger at generere en liste over brugere, som din sagserklæring måske forsøger at kortslutte. Men hvis der ikke er nogen poster i V$-sessionen, bør udvælgelsen være hurtig.
Selvom jeg skal være ærlig, er jeg ikke sikker på, hvorfor vi skal gøre dette. Nul på listen er generelt et passende svar, der angiver ingen brugere. og brugergrænsefladen ville håndtere null, hvilket betyder ingen brugere.
Kan endda være hurtigere, hvis vi mere where-klausulen til inline-visningen..
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