Oracle SQL Developer 使用带有 delete from 子句的始终为“true”条件。(“xxx”为空或“xxx”不为空)

Oracle SQL Developer using an always "true" conditional with delete from clause. ("xxx" is null or "xxx" is not null)

提问人:vsergi 提问时间:5/20/2022 更新时间:5/24/2022 访问量:83

问:

我今天使用的是 Oracle SQL Developer 版本 19.2.1.247,并使用图形方式删除了几行。我的意思是,我选择了这一行并按红色 x 叉号以删除所选行。 它奏效了,一切都很好。删除了行。

但是,我查看了日志并发现了这一点:

DELETE FROM "DB"."PERSONS" WHERE ROWID = 'AADG' AND ORA_ROWSCN = '5196' and ( "ID" is null or "ID" is not null )

好吧,我不明白最后一句话。

"ID" is null or "ID" is not null

显然,在我看来,这总是正确的。我很好奇这个 Oracle SQL 开发人员添加这个的原因。为什么要这样做?什么时候这种说法不会是真的?

null 条件语句 oracle-sqldeveloper

评论

0赞 MT0 5/20/2022
它永远不会是真的,也没有明显的必要添加它。至于“为什么”,你需要作为SQL Developer的设计者(除非有任何在线文档记录了“为什么”,但这不太可能)。
0赞 vsergi 5/20/2022
你的意思是永远不会是假的吗?无论如何,所以没有充分的理由遵循这种方法吗?我只是感到好奇,也许之后有一个很好的理由。所以如果有,我可以学习它。
0赞 MT0 5/20/2022
当你只有二进制 true/false 选项时,“It is never Going be false”和“It is never going not be true”是相同的陈述;所以我是认真的(并试图用双重否定来强调总是真实的),但你的说法也是有效的。
0赞 astentx 5/21/2022
好吧,在 SQL 中,子句只返回值为 predicate 的行,而它的计算结果可能为 、 或(取决于 DBMS)。所以在SQL的过滤条件方面是比较准确的wheretruetruefalseunknown/NULLnot true

答:

0赞 Connor McDonald 5/24/2022 #1

可能只是一个异常,但它不会对语句的执行(或性能)产生任何影响。例如,我做了:

SQL> create table t as select * from scott.emp;

Table created.

然后在 SQL Dev 中删除了一行,从而产生了

DELETE FROM "T" WHERE ROWID = 'AAZRaiABAAAA5eLAAL' 
AND ORA_ROWSCN = '16330866545209' 
and ( "EMPNO" is null or "EMPNO" is not null )

优化器想出了这个:

------------------------------------------------------------------------------------
| Id  | Operation                   | Name | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------
|   0 | DELETE STATEMENT            |      |     1 |    12 |     1   (0)| 00:00:01 |
|   1 |  DELETE                     | T    |       |       |            |          |
|*  2 |   TABLE ACCESS BY USER ROWID| T    |     1 |    12 |     1   (0)| 00:00:01 |
------------------------------------------------------------------------------------

Predicate Information (identified by operation id):
---------------------------------------------------

   2 - filter("ORA_ROWSCN"=16330866545209)

多余的谓词被简单地忽略了。

我的表没有索引或主键,因此看起来只是从表中获取此谓词的第一列。