2012-03-15 3 views
2

에 SQLite 아래 문구가있는 경우 count(t2.ref_id)이 0 인 경우 0으로 나누기에 문제가 있습니다.SQLite에서 0으로 나누기 오류 수정

은 내가 SQLite는 문을 조정할 수 있도록 count(t2.ref_id) 경우 제로 scarsity (scarsity 요인)이 가장 높은 비 제로 scarsity보다 높은 것?

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 

답변

2

값이 0인지 확인하고 다른 작업을 수행해야합니다. 한 가지 일반적인 방법은 NULL으로 값을 변환하기 위해 NULLIF()을 가진 SQL 유형이 많으므로 NULL으로 나누는 것입니다. COUNT()는 당신 불구하고 심지어 두 번 계산되지 않습니다

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 

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 

하지만 대신 더 긴 호흡 CASE 버전을 사용할 수 있도록 SQLite는이 NULLIF()이 있는지 모르겠어요 ... 그것을 두 번 타이핑했다. 값은 다시 사용됩니다 :)

다른 방법으로, 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, 등등

+0

괜찮아 보이지만 나눗셈의 결과는 무엇입니까? * totalItems/null *? 높은 숫자입니까? 나는 0의 발생이 있기 때문에 높은 희생 (가능한 최대)이 필요하다. – xralf

+0

@xralf - NULL을 포함하는 모든 계산은 NULL을 산출합니다. '9 + NULL = NULL','9/NULL = NULL' 등입니다. 그래서 당신의 후속 논리는 'NULL'을 '최대 희소'로 간주해야합니다. 그럴 수 없다면 다른 버전을 사용하고 사용하려는 희소성을 코드화하십시오. – MatBailie

+0

좋은 속임수, 마지막 편집장이 말합니다. – xralf

관련 문제