Исправление деления на ноль в SQLite - PullRequest
3 голосов
/ 15 марта 2012

В моем предложении SQLite ниже есть проблема с делением на ноль в случае, если count(t2.ref_id) равен нулю.

Могу ли я настроить оператор SQLite что если count(t2.ref_id) равно нулю, то скудность (коэффициент скэрусности) будет выше, чем максимальная ненулевая скэрусность?

select t1.id, cast(:totalItems as float) / count(t2.ref_id) as scarsity
from t1 left join t2 on t1.id = t2.ref_id
group by t1.id
order by scarsity

1 Ответ

2 голосов
/ 15 марта 2012

Вам нужно проверить значение 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 и т. Д., И т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...