Обнаружена хранимая процедура SQL "Делить на ноль".

Пытаясь понять, почему моя хранимая процедура выдает ошибку «деления на ноль», я сузил ее до этой области. Если я прокомментирую следующие строки, запрос будет выполнен успешно. Я не уверен, почему.

            PartReceived.QuantityReceived / 
            (CASE 
                WHEN PurchaseOrderItem.QuantityOrdered IS NULL THEN PurchaseOrderItem.QuantityOrdered
                WHEN PurchaseOrderItem.QuantityOrdered = 0 THEN PurchaseOrderItem.QuantityOrdered
                ELSE PurchaseOrderItem.QuantityOrdered
            END) * 100.0 AS PercentageReceived

Я получаю это предупреждение перед ошибкой, но я сделал многое из того, к чему меня привел любой поиск в Google. Я пробовал использовать IFNULL вместо IS NULL THEN, но это тоже не сработало.

Warning: Null value is eliminated by an aggregate or other SET operation.

person devfunkd    schedule 09.11.2015    source источник


Ответы (1)


Вы можете избежать деления на ноль, используя NULLIF():

        PartReceived.QuantityReceived / 
        NULLIF(CASE WHEN PurchaseOrderItem.QuantityOrdered IS NULL THEN PurchaseOrderItem.QuantityOrdered
                    WHEN PurchaseOrderItem.QuantityOrdered = 0 THEN PurchaseOrderItem.QuantityOrdered
                    ELSE PurchaseOrderItem.QuantityOrdered
                END), 0) * 100.0 AS PercentageReceived

Это возвращает результат как NULL, а не генерирует ошибку.

На самом деле, вашу логику гораздо проще было бы записать так:

        (PartReceived.QuantityReceived / 
         NULLIF(PurchaseOrderItem.QuantityOrdered, 0)
        ) * 100.0 AS PercentageReceived

CASE ничего не делает. Все три предложения THEN возвращают одно и то же значение.

person Gordon Linoff    schedule 09.11.2015
comment
Это сработало. Не заметил, что все они возвращали одно и то же значение, пока вы не указали на это. Спасибо Гордон! - person devfunkd; 09.11.2015