与 Java 和 SQL 相比,为什么或条件的工作方式不同

Why or condition is working differently compare with Java and SQL

在Java,

int a = 10, b = 10;

if (a == 10 || b==10)
{
// first condition (a==10) is true, so it wont check further
}

但是,在SQL,

select * from my table where a = 10 or b = 10;

--As per my understanding, It should return data only based on a.
--But it returns both entries. 

这是为什么?

这不是一个很好的比较。但是,它不一定有任何不同。如果您要添加

if (a == 10 || b==10)
{
// first condition (a==10) is true, so it wont check further
// return a or b
}

每次 a 或 b 为 10 时,它都会 return。SQL 语句背后的逻辑几乎相同。

问题在于你如何误解 WHERE,这实际上会 return a 或 b 为 10 的每条记录。

不同之处在于,在 Java 中,我们正在检查条件逻辑,而不是像 SQL 那样进行聚合。

Java 做短路意味着如果检查的第一个操作数为真,它不会做其他操作数。

在 SQL 中,WHERE 语句独立地查找所有 a 条件和 b 条件,因为您使用的是 or

--As per my understanding, It should return data only based on a.

您的理解有误。该查询是内部优化的,您不知道它首先检查的是什么。但它会检查其中一个条件,然后在必要时检查另一个条件以使其为真。

您描述的是提前终止 - 这意味着仅当答案未知时才执行第二条语句,但它不会改变结果(除非您在第二条语句中执行表达式)。

所以 a == 10 || b == 10 将导致 a 或 b 为 10 或 a 和 b 为 10 的任何结果。或更准确地说...

a = 10
b = 10

或者

a = 10
b = 0

或者

a = 0
b = 10

如果 a 恰好是 10,您实际上不需要检查 b - 但某些语言仍然需要。

SQL 不会短路逻辑表达式。当您请求记录时 WHERE A = 10 OR B = 10 您是在请求两者 - 您不是在请求满足第一种情况的记录。

如果你想模拟短路 select 逻辑,你可以改用这个:

Select  *
From    Table
Where   A = 10
Or
(
    A <> 10
And B = 10
)