sql >> Database teknologi >  >> RDS >> Oracle

Brug af select i ELSE i en CASE-sætning giver mig ORA-00937:ikke en enkeltgruppegruppefunktion

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


  1. Vælg et tilfældigt udsnit af resultater fra et forespørgselsresultat

  2. Sådan indstilles skema i pg-promise

  3. Er data i solr understøttet af postgres i ckan

  4. Implementering af automatiseret databasebackup og gendannelse med standardmidler