为什么SQL'从double中选择1,其中0 = null;'传入神谕

时间:2016-11-22 11:15:23

标签: sql database oracle

我在ORACLE中输入以下SQL并传递:

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

更新

因为列'a'是varchar2类型而0是数字类型,如果a不包含null,它将报告错误。

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"

谢谢。

2 个答案:

答案 0 :(得分:4)

它通过,因为syntax是正确的。它包含所有必需元素,因此可以对其进行解析。然后它被执行。请查看陈述如何processed
它不会返回任何结果,因为条件不正确。

答案 1 :(得分:2)

这是因为NULL是一个值,就像任何其他值一样。

不要直接写is,而是假设你传入变量NULL并重写这样的查询:

:1

在这种情况下,select 1 from dual where 0 = :1 的值可能是任何值,这是由调用代码确定的,并且您编写的SELECT语句不知道调用代码将传递的值。 。

因此,甲骨文不可能说这句话无效,即使它可以像你所写的那样完全表示:

:1

因为它也可能是:

select 1 from dual where 0 = null