При тестировании SQL-запроса с предложением WHERE
, связанным с делением, я обнаружил странную ошибку.Задача состоит в том, чтобы найти ошибки в счете-фактуре, где любой из следующих условий:
- Либо
Amount
, либо Tax
равен нулю (не оба); - Оба
Amount
и Tax
не равны нулю, но они не удовлетворяют определенному арифметическому условию.
Итак, запрос, который я пришел, выглядит следующим образом:
SELECT InvoiceNumber, InvoiceDate, Amount, Tax
FROM Invoices
WHERE (Amount <> 0 AND Tax = 0)
OR (Amount = 0 AND Tax <> 0)
OR (Amount <> 0 AND Tax <> 0 AND ABS(Tax / Amount - 0.18) > 0.005)
Что еще более странно, этот запрос работает нормально:
SELECT InvoiceNumber, InvoiceDate, Amount, Tax
FROM Invoices
WHERE Amount <> 0 AND Tax <> 0 AND ABS(Tax / Amount - 0.18) > 0.005
Я полагаю, что булево вычисление в условных предложениях SQL Server не работает, как в C # (где я мог бы ожидать, что ленивая оценка предотвращает деление на ноль, ошибка).
Как сделать этот запрос корректным?
ПРИМЕЧАНИЕ: Есть десятки миллионов записей, поэтому вложенные операторы SELECT
может повлиять на производительность.