Не теряет аспект короткого замыкания. Но SQL не является процедурным языком, и нет никакой гарантии порядка оценки нескольких предикатов.
В C, если вы пишете a || b
, вы знаете, что сначала будет оцениваться a
, затем b
будет оцениваться только при необходимости.
В SQL, если вы пишете a OR b
, вы знаете только то, что сначала будет оцениваться либо a
, либо b
, а другое выражение (по крайней мере, в Oracle) будет оцениваться только при необходимости.
Просмотр плана выполнения для двух запросов может дать некоторое представление о порядке оценки, а может и нет.
Я бы предположил, что в вашем первом случае Oracle видит, что первое выражение будет иметь одинаковое значение для каждой строки, поэтому сначала оценивает его. Когда вы переходите ко второму случаю, Oracle теперь видит функцию, которая может иметь разные результаты при каждой оценке, поэтому ему придется проверять каждую строку, поэтому он пытается выполнить простую проверку на равенство для столбца перед выполнением вызова функции. .
Интересно, получили бы вы другие результаты, если бы отметили функцию DETERMINISTIC, чтобы Oracle знал, что она, по сути, является константой.