В Postgresql после группировки верните false, если какое-либо значение столбца равно false. Если все значения имеют значение true/false, тогда возвращают true / false соответственно

У меня есть таблица под названием "яблоко", и я написал следующий запрос:

select name, 
       count(name), 
       case when istasty is null then false else istasty end 
from apple 
group by name, istasty; 

Это вывод:

Я пытаюсь сгруппировать name а также istasty пометка с использованием следующего условия:

  1. Когда в соответствующем столбце имени указано значение true или false, я возвращаю false. На изображении выше, tala имеет оба true а также false istasty колонка. Тем не менее, я хочу вернуть ложь, потому что он по крайней мере один ложный istasty колонка.
  2. Если после группировки все istasty столбец для конкретного имени столбца true затем вернитесь true; Точно так же, если все istasty столбец falseзатем вернитесь false для этого конкретного столбца имени.

Я могу добиться с помощью bool_and оператор в postgresql написав запрос:

select name, count(name), bool_and(coalesce(istasty = true, false)) from apple group by name;

Можно ли как-то изменить свой первый запрос, чтобы добавить фильтр в having clause чтобы добиться того же результата, что я получил с помощью bool_and оператор во втором запросе? Или есть другой способ?

Обратите внимание, я не использую bool_and оператор. Я ценю ваше время. Спасибо.

2 ответа

Решение

Альтернатива использованию bool_and Оператором будет обычная условная агрегация:

SELECT
    name,
    COUNT(*) AS count,
    CASE WHEN SUM(CASE WHEN !istasty THEN 1 ELSE 0 END) > 0
         THEN FALSE ELSE TRUE END AS result
FROM apple
GROUP BY name;

Я не уверен, что вы имеете в виду, когда вы предлагаете использовать HAVING пункт. Перемещая условную проверку в HAVING Вы можете исключить / включить в запрос определенные группы, соответствующие условию.

Ваша логика (верните true, только если все значения верны) приравнивается к получению min() логическое значение:

select
    name,
    min(istasty::varchar(5))::boolean
from (select name, case when istasty is null then false else istasty end istasty
      from apple
      group by name, istasty) x
group by name

Обратите внимание, что postgres не поддерживает агрегирование boolean значения, поэтому вы должны привести к символу, а затем вернуться к логическому для использования min(),

Другие вопросы по тегам