PG 中表达式的计算顺序

表达式的计算顺序,没有什么意外的。

()* / + -   >
这个是没有疑问的,那么还讲什么呢?


今天看到了这句了:
The order of evaluation of subexpressions is not defined. In particular, the inputs of an operator or function are not necessarily evaluated left-to-right or in any other fixed order.

在一个表达式里面的字表达式的计算顺序是没有定义的,可认为是乱序的,或者特定的开发人员的设定了。

第一个问题:

例如:

1)   ;  selelct  true  or  (3 >2) ;   

2)   ;  select (3>2) or true  ;

这连个sql是不定价的,根据短路原则, 1) sql中的3>2 是不会执行的, 2) sql中的 (3>2)是一定会执行的 ,
 
这是我们常规认为的从左到右的执行顺序下的思考。

pg里面是没有定义的。不一定是这个样子的,所以对于上面的两个sql 第二个要比第一个安全,即确保函数或者表达式(3 >2) 能够被计算一次。


第二个问题:

因为子表达式的计算顺序的不去定性,引发了第二个问题,

具有副作用的函数是不适合作为复杂表达式的一部分而存在的。

尤 其是认为在where  having 等字句里的计算是有顺序的时候,副作用函数的的使用将更具有危险性的 ,因为这些字句在开发执行计划的过程中,广泛的被重新设计,  在这些字句里的逻辑运算符(AND OR NOT ) ,可能被以任何逻辑运算所允许的方式从新组织和计算。
这个时候,具有副作用的函数,可能会在其中的某个部分发挥他的副作用,从而影响到最终的执行结果。

所以强制安排各个字表达式的执行顺序是非常必要的。


例如:

下面的sql

select  * from  t  where x >0 and y/x>1.5 ;  

不一定会确保 y/x 不会发生被零 除的错误。

正确的写法:

select * from  t  where case  when  x > 0  then  y/x >1.5  else  false  end case  ;

当然这个sql 中更适合写为   y  》1.5*x 。


切记   表达式的计算顺序是确定的,但是 子表达式的计算顺序是么有定义的。


来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133735/viewspace-748018/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133735/viewspace-748018/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值