Sql “究竟是什么原因?”;何处<&燃气轮机;空";返回0个结果
我在这里查看了oracle sql示例问题中的一些示例: 我只是好奇为什么“where NULL”会导致它返回0个结果…我最初的想法是,它会生成一个错误,因为NULL不是一个值,您必须使用“where is not NULL” oracle是否只是有一种故障排除机制,即当您没有值时,它不会生成错误,也不会返回任何结果Sql “究竟是什么原因?”;何处<&燃气轮机;空";返回0个结果,sql,oracle,oracle11g,null,Sql,Oracle,Oracle11g,Null,我在这里查看了oracle sql示例问题中的一些示例: 我只是好奇为什么“where NULL”会导致它返回0个结果…我最初的想法是,它会生成一个错误,因为NULL不是一个值,您必须使用“where is not NULL” oracle是否只是有一种故障排除机制,即当您没有值时,它不会生成错误,也不会返回任何结果 编辑:alex poole的答案比“duplicate”中的答案更清晰/更好。Null未定义;它不等于或不等于任何东西。它有,并且显示asking is anything不等于n
编辑:alex poole的答案比“duplicate”中的答案更清晰/更好。Null未定义;它不等于或不等于任何东西。它有,并且显示asking is anything不等于null(使用!=或comparisions)是“unknown” 这不是一个错误,只是查询中的一个bug;这和后面没有表达式是不一样的。您确实有一个表达式,它只是空的,与任何其他值都不可比较 因此,当使用
时,如果某个值为null,则结果未知,并且过滤器会拒绝所有行。如果=null
,即使所有值都不是null,也会发生同样的情况。在这两种情况下,比较的结果都是“未知的”,因此为这两种情况都包含任何行都是不合理的。不能说任何行都符合条件
(可以说,你也不能说任何行不匹配,但在这种情况下,拒绝所有行比包含所有行更有意义——无论如何,对我来说!尽管我喜欢@Sebas的措辞。)如果看到常量NULL,您的想法有一定的道理,但如果考虑变量或字段或绑定变量(可能为NULL),则会更加糟糕。举个例子:
select * from table where field > 5
SQL> create table t$t(a integer, b integer, check(a < b));
Table created
SQL> insert into t$t values (1, 2);
1 row inserted
SQL> insert into t$t values (1, 0);
ORA-02290: check constraint (AP.SYS_C00700649) violated
SQL> insert into t$t values (1, null);
1 row inserted
SQL> insert into t$t values (null, null);
1 row inserted
如果字段包含空值,将引发异常
select * from table1 t1
start with parent_id is null
connect by parent_id = prior id
如果parent_id为null,则将引发异常(是…请查看connect by子句)。。。等等
Oracle使用的规则是:几乎所有带有null的操作(特别设计的操作除外)也会导致null结果。a=null将产生null。空值将产生空值。(1,2,3,null,5)中的a将产生null。等等有时它可以用来简化代码。举个例子:
select * from table where field > 5
SQL> create table t$t(a integer, b integer, check(a < b));
Table created
SQL> insert into t$t values (1, 2);
1 row inserted
SQL> insert into t$t values (1, 0);
ORA-02290: check constraint (AP.SYS_C00700649) violated
SQL> insert into t$t values (1, null);
1 row inserted
SQL> insert into t$t values (null, null);
1 row inserted
SQL>创建表t$t(a整数,b整数,检查(a插入t$t值(1,2);
插入1行
SQL>插入t$t值(1,0);
ORA-02290:违反了检查约束(AP.SYS_C00700649)
SQL>插入到t$t值中(1,null);
插入1行
SQL>插入到t$t值中(null,null);
插入1行
我希望它忽略where子句,因为作为值的东西与不作为值的东西不同。。。我对答案很感兴趣。我想这就是答案:这是另一回事,它在做一个“where null”,这应该导致它永远不会是这样,因为它永远不会不等于null,它会返回吗everything@JoshE条件无效,因此不返回任何内容。你必须按顺序思考。“xxx null是真的吗?”不。可能是hmmm的重复,所以因为它被视为“未知”结果,oracle说“该死,不知道该怎么办,不能比较这两个值,所以我不会返回任何东西”更像是我想比较A和B,但我不知道B是什么,所以我不知道A B可能是什么,所以我就拒绝这个子句?@JoshE-不,实际上Oracle(或任何其他关系数据库)确切地知道在这种情况下该怎么做。规则很简单——“任何与NULL的比较都返回NULL”。