Вам нужно проверить значение 0 и сделать что-то другое. Одним из распространенных способов является деление на NULL
, так как многие разновидности SQL имеют NULLIF()
для преобразования значения в NULL
.
select t1.id, cast(:totalItems as float) / NULLIF(count(t2.ref_id), 0) as scarsity
from t1 left join t2 on t1.id = t2.ref_id
group by t1.id
order by scarsity
Но я не уверен, что SQLite имеет NULLIF()
, поэтому вы могли бы вместо этого использовать более длинную CASE
версию ...
select t1.id, cast(:totalItems as float) / CASE WHEN count(t2.ref_id) = 0 THEN NULL ELSE count(t2.ref_id) END as scarsity
from t1 left join t2 on t1.id = t2.ref_id
group by t1.id
order by scarsity
COUNT()
не будет рассчитываться дважды, даже если вы набрали его дважды. Значение будет использовано повторно:)
Либо сделайте что-то совершенно другое, если вы получите 0 строк ...
select t1.id, CASE WHEN count(t2.ref_id) = 0 THEN 9999999 ELSE cast(:totalItems as float) / count(t2.ref_id) END as scarsity
from t1 left join t2 on t1.id = t2.ref_id
group by t1.id
order by scarsity
Затем вы можете проверить NULL как наибольшее значение или просто проверить на 9999999 и т. Д., И т. Д.