myCol
------
true
true
true
false
false
null
В приведенной выше таблице, если я это сделаю:
select count(*), count(myCol);
я получил 6, 5
Я получаю, 5
поскольку он не считает нулевую запись.
Как мне также подсчитать количество истинных значений (3 в примере)?
(Это упрощение, и на самом деле я использую гораздо более сложное выражение в функции count)
Редактировать сводку: я также хочу включить в запрос простой счетчик (*), поэтому не могу использовать предложение where
sql
postgresql
EoghanM
источник
источник
WHERE myCol = true
туда, если хотите, и если вы удалите первый,*,
он просто вернет номер.Ответы:
или, как вы сами убедились:
источник
ELSE null
чтобы получить тот же результат.Преобразуйте логическое значение в целое число и сумму.
Вы получите
6,3
.источник
Начиная с PostgreSQL 9.4, есть
FILTER
предложение , позволяющее очень кратким запросом подсчитывать истинные значения:Вышеупомянутый запрос является плохим примером, поскольку достаточно простого предложения WHERE и предназначен только для демонстрации синтаксиса. Предложение FILTER выгодно отличается тем, что его легко комбинировать с другими агрегатами:
Это предложение особенно удобно для агрегатов в столбце, который использует другой столбец в качестве предиката, позволяя при этом получать агрегаты с различными фильтрами в одном запросе:
источник
вероятно, лучший подход - использовать функцию nullif.
В основном
или короче
http://www.postgresql.org/docs/9.0/static/functions-conditional.html
источник
nullif([boolean expression], true)
вернет,false
если [логическое выражение] ложно, аnull
если оно истинно, то вы будете считать ложные значения. Я думаю ты хочешьnullif([boolean expression], false)
.nullif([boolean expression], false)
его будет намного легче читать. Затем вы можете изменить часть логического выражения так, как вам нравится, в этом случаеmyCol = true
для подсчета истинных значений, илиmyCol = false
для подсчета ложных значений, илиname='john'
для подсчета людей по имени Джон и т. Д.Самым коротким и ленивым (без кастинга) решением было бы использовать формулу:
Попробуй сам:
дает тот же результат, что и
источник
В MySQL вы также можете сделать это:
Я думаю, что в Postgres это работает:
или лучше (чтобы избежать :: и использовать стандартный синтаксис SQL):
источник
Или может это
источник
myCol
выражение является логическим, вы можете заменить проверку наwhere (myCol)
Просто преобразуйте логическое поле в целое число и просуммируйте. Это будет работать на postgresql:
Надеюсь, это поможет!
источник
Вот способ использования оконной функции:
источник
WHERE myCol = true
. Я привел второй пример не потому, что он быстрее, а скорее как обучающий элемент для оконных функций Postgres, с которыми многие пользователи не знакомы или о которых не знают.сгруппирует 3 возможных состояния bool (false, true, 0) в три строки, что особенно удобно при группировке вместе с другим столбцом, таким как день
источник