|
1
3
不,Oracle对空值的处理是特殊的,与其他人的不同,并且与ANSI标准不一致。然而,在甲骨文的辩护中,在有一个与之一致的美国国家标准协会标准之前,它可能已经决定并致力于这种治疗。 这一切都是从这样一个事实开始的:Oracle存储的字符串的字符数后跟字符串数据。空的字符计数为零,没有后续的字符串数据-与空字符串(“”)完全相同。甲骨文根本没有办法区分它们。 这会导致一些奇怪的行为,比如这个串联案例。Oracle还具有返回字符串长度的函数长度,但这是以相反的方式定义的,因此长度(“”)返回空值而不是零。所以:
在我看来这违反了基本的数学原理。 当然,Oracle开发人员已经习惯了这一点,以至于我们中的许多人甚至看不到它的任何错误或奇怪之处——事实上,有些人会争辩说,世界其他地方是错误的,空字符串和空字符串 是 同样的事情! |
|
|
2
2
@纳兹罗伊:谢谢你的链接。然而,当我阅读该标准时,我相信它指出Oracle的实现实际上是不正确的。第6.13节,一般规则,第2a项:
|
|
|
3
1
well coalesce由SQL-92标准显式定义,以返回列表中的第一个非空值;因此,根据定义,它的Oracle实现运行正常。 编辑: SQL-92 spec ;搜索coalesce以查看其定义。 也就是说,对于空值没有具体的说明,任何涉及空值的操作都必须为空。更确切的限制是,空值既不为假也不为0,也不等于另一个空值(例如,空值==null为假,因为一个空值不等于另一个空值)。然而,这并不意味着,仍然不能有逻辑上一致的方法来处理不总是返回空值的空值。 编辑:所以null+1是空的,就像nan+1仍然是nan一样,实际上它是一个未定义的操作。 |
|
|
4
1
基于 SQL-92 由dcookie和其他DBS的行为突出显示的规范,我想说Oracle的行为不符合其连接操作符的标准。 Oracle(摘自Tuinstoel的回答):
MSSQL:
PostgreSQL:
MySQL:
|
|
|
5
0
字符串与空值的串联不会导致空值。我认为这是正常的行为,我已经习惯了。不知道还能说什么。 |
|
|
vytaute · 返回表类型时Oracle函数中的类型错误 4 年前 |
|
|
BetaRide · Oracle架构用户无法在过程中创建表 8 年前 |
|
|
F.donoso · 嵌套的隐式游标未在数据中清除 8 年前 |
|
|
ADH · 如何在网格中调用过程和输出结果 8 年前 |