Очевидно, что сервер MS Sql поддерживает теорию короткого замыкания, чтобы повысить производительность, избегая ненужных проверок,
Поддерживающий пример:
SELECT 'TEST'
WHERE 1 = 'A'
SELECT 'TEST'
WHERE 1 = 1 OR 1 = 'A'
Здесь первый пример приведет к ошибке «Сбой преобразования при преобразовании значения varchar «A» в тип данных int».
В то время как второе выполняется легко, поскольку условие 1 = 1 оценивается как ИСТИНА, и, следовательно, второе условие вообще не выполняется.
Более того
SELECT 'TEST'
WHERE 1 = 0 OR 1 = 'A'
здесь первое условие будет оценено как ложное, и, следовательно, СУБД перейдет ко второму условию, и снова вы получите ошибку преобразования, как в приведенном выше примере.
ПРИМЕЧАНИЕ. Я НАПИСАЛ ОШИБОЧНОЕ УСЛОВИЕ ТОЛЬКО ДЛЯ ПОНИМАНИЯ, ЕСЛИ УСЛОВИЕ ВЫПОЛНЯЕТСЯ ИЛИ КОРОТКОЕ ЗАМЫКАНИЕ, ЕСЛИ ЗАПРОС РЕЗУЛЬТАТ В ОШИБКЕ ОЗНАЧАЕТ УСЛОВИЕ ВЫПОЛНЕННОЕ, КОРОТКОЕ ЗАМЫКАНИЕ В ПРОТИВНОМ СЛУЧАЕ.
ПРОСТОЕ ОБЪЯСНЕНИЕ
Рассмотреть возможность,
WHERE 1 = 1 OR 2 = 2
поскольку первое условие оценивается как TRUE, бессмысленно оценивать второе условие, потому что его оценка в любом значении вообще не повлияет на результат, поэтому для Sql Server это хорошая возможность сэкономить время выполнения запроса. пропуская ненужную проверку условий или оценку.
в случае "ИЛИ", если первое условие оценено как ИСТИНА, вся цепочка, связанная "ИЛИ", будет считаться оцененной как истинная без оценки другие.
condition1 OR condition2 OR ..... OR conditionN
если условие1 оценивается как истинное, оставит все условия до тех пор, пока условиеN не будет пропущено. В обобщенных словах при определении первого ИСТИНА все остальные условия, связанные оператором ИЛИ, будут пропущены.
Рассмотрим второе условие
WHERE 1 = 0 AND 1 = 1
поскольку первое условие оценивается как FALSE, бессмысленно оценивать второе условие, потому что его оценка в любом значении вообще не повлияет на результат, поэтому снова это хорошая возможность для Sql Server сэкономить время выполнения запроса. пропуская ненужную проверку условий или оценку.
в случае "И", если первое условие оценено как ЛОЖЬ, вся цепочка, связанная с "И", будет считаться оцененной как ЛОЖЬ без оценивая других.
condition1 AND condition2 AND ..... conditionN
если условие1 оценивается как FALSE, остальные условия остаются до тех пор, пока conditionN не будет пропущено. В обобщенных словах при определении первого FALSE все остальные условия, связанные с помощью AND, будут пропущены.
ПОЭТОМУ, МУДРЫЙ ПРОГРАММИСТ ДОЛЖЕН ВСЕГДА ПРОГРАММИРОВАТЬ ЦЕПОЧКУ УСЛОВИЙ ТАКИМ ОБРАЗОМ, ЧТОБЫ ПЕРВЫМ ОЦЕНИВАЛОСЬ МЕНЕЕ ДОРОГОЕ ИЛИ НАИБОЛЕЕ ИСКЛЮЧАЮЩЕЕ УСЛОВИЕ, ИЛИ УСТРОЙСТВОВАТЬ УСЛОВИЯ ТАКИМ ОБРАЗОМ, ЧТО МОЖЕТ ИЗВЛЕЧЬ МАКСИМАЛЬНУЮ ПРЕИМУЩЕСТВУ ОТ КОРОТКОГО ЗАМЫКАНИЯ.
С уважением и благодарностью,
Rk_Hirpara
person
RkHirpara
schedule
12.06.2015
OR
оцениваются в первую очередь (или вообще оцениваются). В этом отношении T-SQL НЕ похож на C#. Вы нельзя полагаться на булево короткое замыкание. - person marc_s   schedule 27.06.2012Why? 1=1 and @id='x' is true
- это или на самом деле, а не и. - person juergen d   schedule 27.06.2012