2012-07-05 1 views
1

Следующий запроса, который я сталкиваюсь с ошибкой деления на 0:Как избежать деления на нулевую ошибку здесь?

select pp.building_name, 
     ld.tenant_trading_name, 
     tenancy_reference, 
     ld.turnover_threshold, 
     ld.percentage_rent, 
     ld.income_base_rent_ach, 
     ld.income_base_rent_ach/ld.percentage_rent as correct 
from 
    lease_deal.lease ld 

inner join property.property pp 
    on ld.building_id = pp.building_id 

where 
    (ld.income_base_rent_ach/ld.percentage_rent) <> ld.turnover_threshold 
    and lease_status = 'APPROVED' 
    and ld.progenesis_load_date is null 
order by pp.building_name 

Я попытался исправить это, выполнив следующие действия - но я получаю ошибку синтаксиса, и я не уверен, почему? Что здесь синтаксически неверно?

select pp.building_name, 
     ld.tenant_trading_name, 
     tenancy_reference, 
     ld.turnover_threshold, 
     ld.percentage_rent, 
     ld.income_base_rent_ach, 
     ld.income_base_rent_ach/ld.percentage_rent as correct 
from 
    lease_deal.lease ld 

inner join property.property pp 
    on ld.building_id = pp.building_id 

where 
    case when ld.percentage_rent = 0 
    then 1=1 
    else ((ld.income_base_rent_ach/ld.percentage_rent) <> ld.turnover_threshold) 
    end 
    and lease_status = 'APPROVED' 
    and ld.progenesis_load_date is null 
order by pp.building_name 

ответ

3

Как о замене

(ld.income_base_rent_ach/ld.percentage_rent) <> ld.turnover_threshold 

с

ld.income_base_rent_ach <> (ld.percentage_rent * ld.turnover_threshold) 
+0

Отлично. Любые мысли о том, почему я тоже получал синтаксическую ошибку (образовательное любопытство) – Codingo

+0

Вы делились на ноль. Дуг удалил эту возможность, изменив ее на умножение (где нуль не проблема). Мой ответ был попыткой разумной проверки на 0 и использования ленивой оценки, чтобы убедиться, что она никогда не делит на ноль. – Fosco

+0

Просто поясните: вы не можете полагаться на ленивую оценку или короткое замыкание, так как вы никогда не можете быть уверены, что данный 'x или y' SQL Server сначала оценит' x' - см. [Этот пост] (http: /dba.stackexchange.com/questions/12941/does-sql-server-read-all-of-a-coalesce-function-even-if-the-first-argument-is-no) для примеров случаев, когда короткое замыкание НЕ работает из-за этого: SQL Server не дает никаких гарантий относительно оценки слева направо, даже в случаях (без каламбура), где документация * делает * заставляет вас полагать, что эта гарантия существует. –