PostgreSQL получает имя пользователя блокирующего и заблокированных пользователей

#sql #postgresql #nested #pid

#sql #postgresql #вложенный #pid

Вопрос:

Я пытаюсь получить имена пользователей блокирующего и заблокированного пользователя, но получаю массив null.

Это то, что я пробовал:

 select pid, 
   usename, 
   pg_blocking_pids(pid) as blocked_by, (select usename from 
pg_stat_activity where pid=ANY(pg_blocking_pids(pid)))
from pg_stat_activity
where cardinality(pg_blocking_pids(pid)) > 0;
  

Этот вложенный выбор возвращает [null].

Дело в том, что если я запрашиваю этот выбор, вставляя вручную значение pid следующим образом

 select usename from pg_stat_activity where pid=ANY(pg_blocking_pids(14648));
  

Я получаю значение, которое я ищу.

Ответ №1:

Я думаю, вам нужно предложение о корреляции:

 select sa.pid, sa.usename, 
       pg_blocking_pids(sa.pid) as blocked_by,
       (select sa2.usename
        from pg_stat_activity sa2
        where sa2.pid = ANY(pg_blocking_pids(sa.pid)))
from pg_stat_activity sa
where cardinality(pg_blocking_pids(sa.pid)) > 0;
  

Вы узнаете, что это работает, если получите сообщение об ошибке, в котором указано, что подзапрос возвращает более одной строки. В этом случае добавьте array_agg() в подзапрос.

Комментарии:

1. Вы можете использовать array(select sa2.usename ...) для возврата всех имен пользователей в виде массива