В 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
пометка с использованием следующего условия:
- Когда в соответствующем столбце имени указано значение true или false, я возвращаю false. На изображении выше,
tala
имеет обаtrue
а такжеfalse
istasty
колонка. Тем не менее, я хочу вернуть ложь, потому что он по крайней мере один ложныйistasty
колонка. - Если после группировки все
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()
,