Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'utilisation de select dans ELSE d'une instruction CASE me donne ORA-00937:pas une fonction de groupe à groupe unique

En adoptant une approche légèrement différente, mais cela semble fonctionner. Au lieu de caser et de compter, vérifiez simplement si l'agrégat est nul (coalesce renvoie la première valeur non nulle d'une série) et s'il remplace votre message. Cela évite un regroupement de 2e niveau qui, à mon avis, n'est pas nécessaire.

Dommage que listagg ne supporte pas non plus distinct au sein de l'agrégat; nous pourrions éviter la vue en ligne.

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

Cela a la surcharge en ce sens qu'il tente de générer une liste d'utilisateurs que votre déclaration de cas peut tenter de court-circuiter. Cependant, s'il n'y a pas d'enregistrements dans V$session, la sélection distincte devrait être rapide.

Bien que pour être honnête, je ne sais pas pourquoi nous devons faire cela. Null dans la liste est généralement une réponse adéquate indiquant qu'il n'y a pas d'utilisateurs. et l'interface utilisateur gérerait null, ce qui signifie qu'il n'y a pas d'utilisateurs.

Peut même être plus rapide si nous ajoutons la clause where à la vue en ligne.

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