2014-10-20 73 views
0

我在看一個我沒有寫在這裏的腳本。它看起來像這樣:爲什麼Oracle不會在這裏拋出一個錯誤

SELECT 
... 
AND (
     A.FIELD IN 
     (
     ... 
     ... 
     ) 
     OR B.FIELD IN 
     (
     ... 
     ... 
     ) 
    ) 
... 

在它自己的腳本運行良好。沒有錯誤。但是當我將其更改爲:

SELECT 
... 
AND B.FIELD IN 
     (
     ... 
     ... 
     ) 
... 

Oracle拋出ORA-01722: invalid number。爲什麼它不會爲第一個查詢拋出它呢?

更新

A.FIELD是一個數字 B.FIELD是VARCHAR2

值對工作是一個數字。所以我明白並同意這個錯誤,但我想知道爲什麼它不會被拋出第一個查詢。但第二個是。

+2

很難說沒有看到在'B.FIELD'的'IN'任何值。 – 2014-10-20 13:07:40

+3

我會假設第一條語句不評估B.Field部分,因爲A.Field在OR語句中是真實的,儘管我不確定SQL是否懶惰地評估語句。 – Grice 2014-10-20 13:09:01

+0

@ X.L.Ant我已經更新了我的問題。我明白爲什麼會出現錯誤,但不是爲什麼它不會在第一條語句中出現,而是在第二條語句中出現。 Oracle如何執行這樣的查詢 – Jonnny 2014-10-20 13:12:48

回答

2

從Oracle的文檔:

當評估的邏輯表達式,PL/SQL使用短路 評價。也就是說,只要 結果可以確定,PL/SQL就停止評估表達式。這使您可以編寫可能會導致錯誤的表達式。

查看http://docs.oracle.com/cd/B19306_01/appdev.102/b14261/fundamentals.htm#sthref481進一步解釋和示例。

他們也有這個單獨的文檔專門提的是,ORhttp://www.oracle-base.com/articles/misc/short-circuit-evaluation-in-plsql.php

+2

我同意,但這是一個SQL查詢,而不是PL/SQL。 – 2014-10-20 13:17:08

+0

@troygizzi感謝這個特洛伊 – Jonnny 2014-10-20 13:19:07

+1

[這個小提琴](http://sqlfiddle.com/#!4/a6611/3)重現錯誤。短路似乎在這裏工作,但我很驚訝,即使這些類型是不兼容的。除非在SQL中找到關於這個特殊情況的官方文檔,否則我不會太依賴這個。 – 2014-10-20 13:22:01

相關問題