2016-11-22 79 views
0

我在ORACLE键入下面的SQL,它通过:为什么SQL'选择1从双方0 = null;'通过在Oracle

select 1 from dual where 0=null; 

为什么SQL传递,它似乎没有编译错误奇怪。而且,如果null是表中的varchar2列,它也会通过。

create table test 
(
    a varchar2(100), 
    b varchar2(100) 
) 

insert into test(a,b) VALUES (null, 'abc'); 
commit; 

select * from test where a=0 

更新:

由于列“一”是VARCHAR2类型,0是一个数字类型,如果一个不包含空值,它会报告错误。

create table test 
(
    a varchar2(100), 
    b varchar2(100) 
) 

insert into test(a,b) VALUES ('abc', 'abc'); 
commit; 


select * from test where a=0 

--ORA-01722 "invalid number" 

谢谢。

+0

你有什么关于查询的期望? –

+1

你是什么意思“通行证”? '0 = null'没有任何*语法错误。它从来没有评估为真。 –

+1

你的问题到底是什么?这里意外的是什么? – Bohemian

回答

4

它通过,因为syntax是正确的。它包含所有必需的元素,因此可以进行分析。然后它被执行。请参阅语句如何processed
它不会返回任何结果,因为条件不成立。

2

这是因为NULL是一个值,就像任何其他值一样。如果没有使用is,(in)相等检查将失败,但语法仍然有效。

而不是直接写入NULL让我们假设你正在传递一个变量:1和重新编写查询这样的:

select 1 from dual where 0 = :1 

在这种情况下,:1值可以是任何东西,决心这是由调用代码和你写的SELECT语句不知道调用代码会传入什么值。

因此,Oracle不可能说这个语句是无效的,即使它可以完全按照您所写的表示:

select 1 from dual where 0 = null 

,因为这也可能是:

select 1 from dual where 0 = 0