我在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"
谢谢。
答案 0 :(得分:4)
答案 1 :(得分:2)
这是因为NULL
是一个值,就像任何其他值一样。 1}}中的(in)相等检查将失败,但语法仍然有效。
不要直接写is
,而是假设你传入变量NULL
并重写这样的查询:
:1
在这种情况下,select 1 from dual where 0 = :1
的值可能是任何值,这是由调用代码确定的,并且您编写的SELECT语句不知道调用代码将传递的值。 。
因此,甲骨文不可能说这句话无效,即使它可以像你所写的那样完全表示:
:1
因为它也可能是:
select 1 from dual where 0 = null