【问题标题】:Why or condition is working differently compare with Java and SQL与 Java 和 SQL 相比,为什么或条件的工作方式不同
【发布时间】:2016-01-30 02:38:19
【问题描述】:

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

这是为什么呢?

【问题讨论】:

  • 这不是 WHERE 语句的工作方式。我假设您要做的是获取 a=10 的所有行,除非 a!=10,然后获取 b=10 的所有行。

标签: java sql if-statement plsql conditional


【解决方案1】:

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

所以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 - 但有些语言仍然需要。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

      不同之处在于,在 Java 中,我们检查的是条件逻辑,而不是 SQL 所做的聚合。

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

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

      【讨论】:

        【解决方案4】:
        --As per my understanding, It should return data only based on a.
        

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

        【讨论】:

          【解决方案5】:

          SQL 不会短路逻辑表达式。当您要求记录 WHERE A = 10 OR B = 10 时,您是在要求两者 - 您不是在要求满足第一个案例的记录。

          如果您想模拟该短路选择逻辑,您可以改用它:

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

          【讨论】:

          • SQL 短路逻辑表达式。 OP 只是对基于集合的处理如何工作感到困惑,仅此而已。
          猜你喜欢
          • 1970-01-01
          • 2012-09-21
          • 2022-01-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-09-04
          • 2018-02-23
          • 1970-01-01
          相关资源
          最近更新 更多