相关疑难解决方法(0)

是否对SQL WHERE子句进行了短路评估?

例如:

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的?

参考:短路评估

sql short-circuiting

135
推荐指数
6
解决办法
5万
查看次数

所有编程语言都有布尔短路评估吗?

在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)

language-agnostic if-statement short-circuiting

38
推荐指数
7
解决办法
9890
查看次数

没有与Oracle功能的短路OR?

要允许超级用户/管理员登录我的系统,我正在运行(更大版本)此查询:

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会失去其短路方面?

sql oracle plsql short-circuiting

1
推荐指数
1
解决办法
1828
查看次数