Начиная с PostgreSQL 9.4 есть предложение FILTER
, которое позволяет очень краткому запросу подсчитывать истинные значения:
select count(*) filter (where myCol)
from tbl;
Приведенный выше запрос является плохим примером в том, чтодостаточно простого предложения WHERE, и оно предназначено только для демонстрации синтаксиса.Идея FILTER блестяще в том, что ее легко комбинировать с другими агрегатами:
select count(*), -- all
count(myCol), -- non null
count(*) filter (where myCol) -- true
from tbl;
Предложение особенно удобно для агрегатов в столбце, в котором в качестве предиката используется другой столбец, позволяя при этом извлекать по-разному отфильтрованные агрегаты.в одном запросе:
select count(*),
sum(otherCol) filter (where myCol)
from tbl;