Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql “究竟是什么原因?”;何处<&燃气轮机;空";返回0个结果_Sql_Oracle_Oracle11g_Null - Fatal编程技术网

Sql “究竟是什么原因?”;何处<&燃气轮机;空";返回0个结果

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

我在这里查看了oracle sql示例问题中的一些示例:

我只是好奇为什么“where NULL”会导致它返回0个结果…我最初的想法是,它会生成一个错误,因为NULL不是一个值,您必须使用“where is not NULL”

oracle是否只是有一种故障排除机制,即当您没有值时,它不会生成错误,也不会返回任何结果


编辑: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”。