Наиболее распространенным, безусловно, повод для такого рода код, который появится кто-то, кто является новым для SQL, CASE
выражений или обоих. Они как-то фиксируются на CASE
и решают, что они должны использоваться для всех условных оценок.
Это, как правило, ошибка, и может быть заменена более простой логический логично, так как @Bogdan предложил в комментариях:
((C.SAPCustomerNumber = @searchID) OR (C.SAPCustomerNumber = @SapID) OR (@searchID = ''))
Вторая причина этого может быть сделано, если кто-то пытается провести в жизнь порядок оценки предикатов . CASE
документируется для оценки своих условий WHEN
(при условии, что они являются скалярными выражениями, а не агрегатами). Я бы серьезно не рекомендовал, чтобы кто-то действительно писал такой код, хотя это, скорее всего, ошибочно принимается за первую форму. И даже если конкретный оценочный заказ лучше всего сегодня, с сегодняшними данными, кто скажет, будет ли он по-прежнему правильным завтра или через месяц или годы?
SQL не гарантирует порядок вычисления для WHERE
предикатов в статье рассматриваются вообще, ни какой-либо форме короткого замыкания оценки. Оптимизатор, как правило, может свободно переупорядочивать предикаты - как в предложении WHERE
, так и в статьях JOIN
/ON
- попытаться добиться общего результата как можно дешевле. Вы не должны, как правило, пытаться помешать этому.
Если он не выбирает наиболее эффективный план, это гораздо лучше фиксируется путем обновления/создания индексов и статистики или фактического форсирования определенного плана, а не использования CASE
.
Я никогда не следовал этому образцу, но может быть проверка/безопасность? 0 будет оцениваться как false, что заставляет запрос возвращать 0 результатов. –
Да, это странно - его можно изменить как '((C.SAPCustomerNumber = @searchID) ИЛИ (C.SAPCustomerNumber = @SapID) ИЛИ (@searchID = ''))'. Результат будет таким же, и он будет намного более читабельным. –
Спасибо, просто хотел убедиться, что я чего-то не упустил. Это было легкое предложение CASE, есть намного хуже для настройки. :( –