sql >> Databasteknik >  >> RDS >> Oracle

Att använda select i ANDET i en CASE-sats ger mig ORA-00937:inte en gruppfunktion med en enda grupp

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


  1. Hur man returnerar Unix-tidsstämpeln i Oracle

  2. Oracle APEX - Exportera en fråga till CSV med en knapp

  3. MySql vägrar att använda index

  4. Spring JDBC-mall- Hur man hämtar flera resultat med flera parametrar med en enda fråga