【问题标题】:Does + or - have operator precedence in Oracle arithmetic?+ 或 - 在 Oracle 算术中是否具有运算符优先级?
【发布时间】:2013-07-03 20:51:46
【问题描述】:

以下工作方式的OPs request for an explanation 提出了一个我不确定的观点。

select sysdate + (interval_difference * 1440) - sysdate
  from (select systimestamp - (systimestamp - 1) as interval_difference
          from dual )

也就是说,加号或减号有运算符优先级吗? The documentation1列出算子顺序如下

+----------------------------+-------- ------------------------------------+ |操作员 |操作 | +-------------------------------------------------- ------------------------------------+ | +, - (作为一元运算符) |同一性、否定性、层次结构中的位置 | | , 之前, CONNECT_BY_ROOT | | +----------------------------+-------- ------------------------------------+ | *, / |乘法,除法 | +----------------------------+-------- ------------------------------------+ | +, - (作为二元运算符) |加法、减法、连接 | | , || | | +----------------------------+-------- ------------------------------------+

查询一旦减少,就会变成date + interval - date。但是,interval - date 部分 is invalid

操作是否有效是因为运算符的优先顺序将二进制加号置于二进制减号之上,或者因为 Oracle 足够聪明地知道一个操作无效而另一个无效(即它已被黑客用于日期时间/间隔算术) ?

换句话说,为什么date + interval - date 被执行为(date + interval) - date 而不是date + (interval - date)

将 + 放在 - 之前的文档可能被解释为暗示 + 确实具有优先权,但这并不能证明任何事情,而且该操作成功的事实也可能证明某些事情,除非在任何其他方式。

手头的信息指向 + 具有优先权,但这都是间接的。这是否可以通过一种方式或另一种方式证明?

1。对于 11.2,但 10g 和 9i 文档毫无疑问是相同的

【问题讨论】:

    标签: oracle operator-precedence


    【解决方案1】:

    因为+-都是left-associative

    • a + b + c 表示(a + b) + c
    • a + b - c 表示(a + b) - c
    • a - b + c 表示 (a - b) + c。 (还有(3 - 2) + 1 != 3 - (2 + 1)。)
    • a - b - c 表示 (a - b) - c。 (还有(3 - 2) - 1 != 3 - (2 - 1)。)

    (The page that you link to实际上提到了这一点:

    Oracle 在表达式中从左到右计算具有相同优先级的运算符。

    虽然如果你不知道要寻找什么很容易错过。)

    【讨论】:

    • 现在我觉得自己很愚蠢:-)。不记得基本的数学......是的,只是重新阅读文档并看到它:-(。谢谢!
    • 奇怪的是PL/SQL equivalent 说“具有相同优先级的操作员不按特定顺序进行评估”。
    • @AlexPoole:疯了!你认为他们真的是那个意思吗?
    • 你能想出一个这样的例子然后@Alex吗?在 PL/SQL 中执行的 same thing 可能意味着它仍然会发生,因为如果没有,它可能会失败。
    • 不,我怀疑他们的意思,我认为文档措辞不好。我希望它能够像在 SQL 中那样工作,但我还没有尝试测试它(还没有!)。可能是一个文档错误。很难相信某些基本事物的行为可能是不确定的。
    猜你喜欢
    • 2014-06-03
    • 2015-08-29
    • 2019-06-06
    • 1970-01-01
    • 2019-02-02
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多