2014-10-20 95 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

相关问题