Самый простой способ - удалить else 0
:
SUM( CASE WHEN dismissal_kind = 'caught' THEN 1 END )
. Возвращает NULL
, если ничего не соответствует условию. При делении на NULL
получается NULL
, а не ошибка.
Однако для вашего запроса я рекомендую:
select bowler as b,
count(*) / nullif(count(*) filter (where dismissal_kind = 'caught'), 0)
from deliveries
group by bowler;
nullif()
- это еще один способ избежать деления на ноль. filter
является рекомендуемым (и стандартным) синтаксисом для условного агрегирования.
Если вы хотите отфильтровать строки, которые являются null
, вы можете включить предложение having
:
select bowler as b,
count(*) / nullif(count(*) filter (where dismissal_kind = 'caught'), 0)
from deliveries
group by bowler
having count(*) filter (where dismissal_kind = 'caught') > 0;