Coalesce(null,'') 在 Oracle 中获取 null 并在 SQL Server 中获取 ''?

Posted

技术标签:

【中文标题】Coalesce(null,\'\') 在 Oracle 中获取 null 并在 SQL Server 中获取 \'\'?【英文标题】:Coalesce(null,'') gets null in Oracle and gets '' in SQL Server?Coalesce(null,'') 在 Oracle 中获取 null 并在 SQL Server 中获取 ''? 【发布时间】:2018-11-12 02:39:34 【问题描述】: Oracle 版本:12.1.0.2.0 SQL Server 版本:2012

我的代码:

select COALESCE (null, '') 
from dual

在 Oracle 中返回 null 结果,但是

select COALESCE (null, '')

在 SQL Server 中返回 '' 结果。

为什么这个结果不同?

都是ANSI标准,不应该一样吗?

【问题讨论】:

【参考方案1】:

在关于NULL的Oracle文档中

Oracle 数据库将长度为零的字符值视为空值。

Oracle 在内部将空字符串更改为 NULL 值。 Oracle 根本不允许插入空字符串。

select null from dual

select '' from dual

都是返回NULL

因此,当您使用 select COALESCE (null,'') from dual 时,它将在 Oracle 中转换为 select COALESCE (null,null) from dual

sqlfiddle

这是一个讨论这个的链接。

Why does Oracle 9i treat an empty string as NULL?

【讨论】:

【参考方案2】:

在处理可变长度字符类型(例如VARCHARVARCHAR2)时,将零长度字符串分配给字段会导致NULL。但是,当将零长度字符串分配给固定长度字符类型(例如 CHAR)时,结果是该字段被空白填充到完全定义的长度,这是 CHAR 数据类型所要求的。 See this AskTom question 了解更多信息。

【讨论】:

【参考方案3】:

您是否在 Oracle 和 SQL Server 中尝试过以下代码:

select COALESCE (null,' ') from dual
select COALESCE (null,' ')

它在 Oracle 和 SQL Server 中都返回 not null 结果

主要问题是 Oracle 和 SQL Server 如何处理第二个表达式''。在 Oracle 中,它被视为NULL,但 SQL Server 将其视为一个空白空间。

【讨论】:

确切地说,我不会称之为parameter..Expression【参考方案4】:

根据Oracle docs:

Oracle 数据库将长度为零的字符值视为空值。

这不是 ANSI 标准。

【讨论】:

以上是关于Coalesce(null,'') 在 Oracle 中获取 null 并在 SQL Server 中获取 ''?的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server中COALESCE函数的用法

在 PostgreSQL 中使用 COALESCE 处理 NULL 值

处理空值,把 Null 值转换为实际值(coalesce,nvl 函数用法)

如果一列为 Null,则 SQL 返回 Null(与 COALESCE() 相反)

插入一个 COALESCE(NULL,default)

MySQL 在 WHERE 语句中使用 COALESCE 或 IFNULL 选择非 NULL 值