Oracle
 sql >> база данни >  >> RDS >> Oracle

Използването на select в ELSE на оператор CASE ми дава ORA-00937:не групова функция за една група

Използвайки малко по-различен подход, но изглежда, че работи. Вместо да използвате регистър и да преброявате, просто проверете дали агрегатът е нулев (coalesce връща първата ненулева стойност в поредица) и ако е, заменете вашето съобщение. Това избягва групиране на второ ниво, което не вярвам, че е необходимо.

Жалко, че listagg не поддържа и distinct в агрегата; можем да избегнем вградения изглед.

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

Това наистина има допълнителни разходи, тъй като се опитва да генерира списък с потребители, които вашият случай може да се опитва да късо съединение. Ако обаче няма записи във V$session, изборът на различен трябва да бъде бърз.

Въпреки че, честно казано, не съм сигурен защо трябва да правим това. Null в списъка обикновено е адекватен отговор, показващ липса на потребители. и потребителският интерфейс ще обработва null, което означава, че няма потребители.

Може дори да бъде по-бързо, ако добавим клаузата where към вградения изглед..

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Logrotate за почистване на файлове с щампа с дата

  2. Как да генерирам списък с всички дати между sysdate-30 и sysdate+30?

  3. Липсва дясна скоба при SQL команда за създаване на таблица

  4. Не може да се зареди файл или сборка за Oracle.DataAccess в .NET

  5. Oracle XE 11g базата данни XE не беше намерена