例如:
SELECT *
FROM Table t
WHERE @key IS NULL OR (@key IS NOT NULL AND @key = t.Key)
Run Code Online (Sandbox Code Playgroud)
如果@key IS NULL的计算结果为true,那么@key IS是否为NULL并且@key = t.Key是否已计算?
如果不是,为什么不呢?
如果是,是否有保证?它是ANSI SQL的一部分还是特定于数据库?
如果是数据库特定的,SqlServer?甲骨文?MySQL的?
参考:短路评估
在PHP代码中
if(a() && b())
Run Code Online (Sandbox Code Playgroud)
当第一个操作数求值时false,b()将不会被求值.
同样地,在
if (a() || b())
Run Code Online (Sandbox Code Playgroud)
当第一个操作数计算到true,b()将不会被评估..
这适用于所有语言,如Java,C#等吗?
这是我们使用的测试代码.
<?php
function a(){
echo 'a';
return false;
}
function b(){
echo 'b';
return true;
}
if(a() && b()){
echo 'c';
}
?>
Run Code Online (Sandbox Code Playgroud) 要允许超级用户/管理员登录我的系统,我正在运行(更大版本)此查询:
Select *
From mytable
Where (:id = 'Admin' Or :id = mytable.id);
Run Code Online (Sandbox Code Playgroud)
如果我传递用户ID,我会获得该用户的所有数据; 如果我传递字符串'Admin',我会得到所有数据.这是有效的,因为Oracle的OR是一个短路运算符.
但是,如果我将'Admin'作为一个包常量并使用函数来获取它,就像这样
Select *
From mytable
Where (:id = mypackage.GetAdminConstant Or :id = mytable.id);
Run Code Online (Sandbox Code Playgroud)
ORA-01722: invalid number当我通过'Admin'时,我得到了.
当我引入函数时,为什么OR会失去其短路方面?