Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Die Verwendung von select im ELSE einer CASE-Anweisung gibt mir ORA-00937:keine Einzelgruppen-Gruppenfunktion

Verwenden Sie einen etwas anderen Ansatz, aber es scheint zu funktionieren. Anstatt Gehäuse und eine Zählung durchzuführen, überprüfen Sie einfach, ob das Aggregat null ist (Coalesce gibt den ersten Nicht-Null-Wert in einer Reihe zurück) und ob es Ihre Nachricht ersetzt. Dies vermeidet eine Gruppierung auf zweiter Ebene, die meines Erachtens nicht erforderlich ist.

Schade, listagg unterstützt nicht auch deutlich innerhalb des Aggregats; wir könnten die Inline-Ansicht vermeiden.

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

Dies hat jedoch den Overhead, dass versucht wird, eine Liste von Benutzern zu erstellen, die Ihre case-Anweisung möglicherweise kurzschließen möchte. Wenn es jedoch keine Datensätze in V$session gibt, sollte die Auswahl von Distinct schnell gehen.

Obwohl ich mir ehrlich gesagt nicht sicher bin, warum wir das tun müssen. Null in der Liste ist im Allgemeinen eine angemessene Antwort, die anzeigt, dass keine Benutzer vorhanden sind. und die Benutzeroberfläche würde null verarbeiten, was bedeutet, dass keine Benutzer vorhanden sind.

Kann sogar schneller sein, wenn wir die where-Klausel in die Inline-Ansicht einfügen..

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