Таким образом, в SQL Server нет прямого замыкания, как, например, в операторах if в языках программирования общего назначения.
Итак, рассмотрим следующий макет запроса:
SELECT * FROM someTable
WHERE name = 'someValue' OR name in (*some extremely expensive nested sub-query only needed to cover 0.01% of cases*)
Допустим, в таблице всего 3 строки, и все они соответствуют name = 'someValue'. Будет ли когда-либо выполняться дорогостоящий подзапрос? Допустим, есть 3 миллиона строк, и все, кроме 1, могут быть получены с именем = 'someValue', кроме 1 строки, которую необходимо получить с помощью подзапроса. Будет ли подзапрос когда-либо оцениваться, когда он не нужен?
Если у кого-то есть аналогичный реальный случай, можно позволить 0,01% дождаться выполнения дорогостоящего подзапроса, прежде чем получать результаты, если результаты извлекаются быстро без подзапроса для 99,99% случаев. (Я знаю, что мой конкретный пример выше может быть явно обработан с помощью операторов IF в SP, как это предлагается в этой связанной теме: Короткое замыкание Sql ИЛИ или условное существует в предложении where, но давайте предположим, что это не вариант.)
CASE
более надежно, чем логические операторы, но не гарантирует 100% отсутствие ненужных предложений (но все же гораздо более последовательно). Если вам нужна производительность, это, вероятно, лучший вариант. - person Jeroen Mostert   schedule 23.04.2020someValue
, но даже если нет, он необходим. Если вы говорите, что у вас будет по крайней мере одна строка, не равнаяsomeValue
, тогда да, ее нужно будет выполнить, без этого не обойтись. Однако, скорее всего, он будет выполнен, когда все строки равныsomeValue
. Если он должен оставаться одним запросом, сделайте два запроса, для= 'someValue'
и для<> 'someValue' and (expensive)
, иunion all
результаты в один. Хотя это все равно не гарантирует. - person GSerg   schedule 23.04.2020