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 。
切記 表示式的計算順序是確定的,但是子表示式的計算順序是麼有定義的。
()* / + - >
這個是沒有疑問的,那麼還講什麼呢?
今天看到了這句了:
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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- javascript表示式中的運算順序簡單介紹JavaScript
- 腦圖學習 JavaScript 之犀牛書【四 · 二】表示式、計算順序JavaScript
- 計算中綴表示式
- C/C++多引數函式引數的計算順序與壓棧順序C++函式
- [java基礎] 之 表示式和運算子的優先順序Java
- 使用棧結構計算中綴表示式
- 正規表示式的用途語法與優先順序(/應為\)
- 如何計算FMEA的風險順序數(RPN)
- 表示式計算(棧的應用)
- 【資料結構與演算法】中綴表示式轉字尾表示式以及字尾表示式的計算資料結構演算法
- css 選擇器優先順序的計算過程CSS
- 二叉樹中序和後序遍歷表示式二叉樹
- 表示式計算 用棧完成
- 一個數學表示式的計算
- 中綴表示式的計算,C++版本,Linux環境C++Linux
- 將算數表示式轉換成字尾表示式並計算結果
- 各類運算子和計算方法,優先順序
- js實現四則計算(中綴,字尾表示式)JS
- CSS 世界中的方位與順序CSS
- 中斷優先順序
- python--表示式(運算表示式)Python
- python的順序程式設計Python程式設計
- 算術表示式的字首式、中綴式、字尾式相互轉換
- 33:計算分數加減表示式的值
- 表示式編譯計算器(下) (轉)編譯
- 第二週 資料計算實現與順序程式設計(一)程式設計
- js解惑-函式執行順序JS函式
- mysql 中sql語句關鍵字的書寫順序與執行順序MySql
- MySQL 查詢中保留 IN 中的順序MySql
- css中連結偽類的順序CSS
- Java中class的初始化順序Java
- CSS中屬性的書寫順序CSS
- Nginx中的一些匹配順序Nginx
- JAVA中取順序號 (轉)Java
- 【計算機演算法】 求字首表示式的值計算機演算法
- pg 中日期型的計算問題
- 表示式計算原始碼JAVA實現 (轉)原始碼Java
- 圖解計算機中的資料表示形式圖解計算機