sql >> Database >  >> RDS >> Oracle

Het gebruik van select in de ELSE van een CASE-instructie geeft me ORA-00937:geen groepsfunctie met één groep

Met een iets andere benadering, maar het lijkt te werken. In plaats van hoofdletters te maken en een telling uit te voeren, controleert u gewoon of het aggregaat null is (samenvoegen geeft de eerste niet-null-waarde in een reeks) en of het uw bericht is. Dit vermijdt een groepering op het 2e niveau die naar mijn mening niet nodig is.

Jammer dat listagg ook geen onderscheid ondersteunt binnen het aggregaat; we zouden de inline-weergave kunnen vermijden.

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%'

Dit heeft de overhead in die zin dat het probeert een lijst met gebruikers te genereren die uw case-statement mogelijk probeert te kortsluiten. Als er echter geen records in V$session zijn, zou het selecteren van onderscheid snel moeten zijn.

Hoewel ik eerlijk gezegd niet zeker weet waarom we dit moeten doen. Null in de lijst is over het algemeen een adequaat antwoord dat aangeeft dat er geen gebruikers zijn. en de gebruikersinterface zou null verwerken, wat betekent dat er geen gebruikers zijn.

Het kan zelfs sneller zijn als we de waar-clausule meer naar de inline-weergave plaatsen.

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. NUMTOYMINTERVAL() Functie in Oracle

  2. Converteer 'smalldatetime' naar 'datetime2' in SQL Server (T-SQL-voorbeelden)

  3. Eenvoudige Oracle-variabele SQL-toewijzing

  4. Reset het root-wachtwoord van MySQL op Windows