SELECT IFNULL(NULL, 'Replaces the NULL')
--> Replaces the NULL
SELECT COALESCE(NULL, NULL, 'Replaces the NULL')
--> Replaces the NULL
这两个子句的主要区别是参数传递。对于< code>IFNULL是两个参数,对于< code>COALESCE是多个参数。所以除此之外,这两者之间还有其他区别吗?
它在MS SQL中有何不同?
SQL-服务器的区别:
>
没有 IFNULL()
函数,但有一个类似的异号()
< code>ISNULL只接受2个参数,而COALESCE接受可变数量的参数
COALESCE
基于ANSISQL标准,而ISNULL
是专有的TSQL函数
ISNULL
和COALESCE
的验证也不同。例如,ISNULL
的NULL
值转换为int,而对于COAELSCE
,您必须提供类型。例如:
>
国际素(空,空)
: 是整数。
COALESCE(NULL, NULL)
:将抛出错误。
COALESCE(CAST(NULL as int), NULL)
:有效并返回int。
结果表达式的数据类型确定-ISNULL
使用第一个参数类型,COALESCE
遵循CASE
表达式规则并返回具有最高优先级的值类型。
>
合并
是 SQL 标准函数。
而< code>IFNULL是特定于MySQL的,它在MSSQL中的对等用法(< code>ISNULL)是特定于MSSQL的。
< code>COALESCE可以处理两个或更多参数(实际上,它可以处理单个参数,但在这种情况下几乎没有用:< code > COALESCE(a)≡< code > a )。
而MySQL的 IFNULL
和MSSQL的ISNULL
是COLESCE
的有限版本,只能使用两个参数。
>
每个事务SQL留档,COALESCE
只是CASE
的语法糖,并且可以多次评估其参数。更详细地说:COALESCE(a1, a2,…, aN)
⃣CASE WHEN(a1 IS Not NULL)然后a1 WHEN(a2 IS Not NULL)然后a2 ELSE aN END
。这大大降低了MSSQL中COALESCE
的有用性。
另一方面,MSSQL中的< code>ISNULL是一个普通函数,从不对其参数进行多次求值。MySQL和PostgreSQL中的< code>COALESCE都不会对其参数进行多次求值。
目前,我不知道SQL标准是如何定义< code>COALESCE的。
正如我们从前面所看到的,RDBMS中的实际实现各不相同:一些(例如MSSQL)使COLESCE
多次评估其参数,一些(例如MySQL,后greSQL) - 没有。
c-treeACE声称它的COALESCE
实现是SQL兼容的,它说:“GROUP BY子句中不允许使用此函数。此函数的参数不能是查询表达式。”我不知道这些限制是否真的符合SQL标准;大多数COALESCE的实际实现(例如MySQL、PostgreSQL)没有这样的限制。IFNULL
/ISNULL
作为普通函数,也没有这样的限制。
除非您面临特定RDBMS中< code>COALESCE的特定限制,否则我建议始终使用< code>COALESCE,因为它更标准、更通用。
例外情况是:
COALESCE(expr1,…)
可能会对expr1
求值两次)两者之间的主要区别在于< code>IFNULL函数接受两个参数,如果它不是< code>NULL则返回第一个参数,如果第一个参数是< code>NULL则返回第二个参数。
<code>COALESCE</code>函数可以接受两个或多个参数并返回第一个非NULL参数,如果所有参数都为空,则<code>NULL</code>函数可以返回第一个参数,例如:
SELECT IFNULL('some value', 'some other value');
-> returns 'some value'
SELECT IFNULL(NULL,'some other value');
-> returns 'some other value'
SELECT COALESCE(NULL, 'some other value');
-> returns 'some other value' - equivalent of the IFNULL function
SELECT COALESCE(NULL, 'some value', 'some other value');
-> returns 'some value'
SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'
更新:MSSQL 执行更严格的类型和参数检查。此外,它没有 IFNULL
函数,而是具有 ISNULL
函数,它需要知道参数的类型。因此:
SELECT ISNULL(NULL, NULL);
-> results in an error
SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL
此外,MSSQL中的COALESCE
函数要求至少一个参数为非空,因此:
SELECT COALESCE(NULL, NULL, NULL, NULL, NULL);
-> results in an error
SELECT COALESCE(NULL, NULL, NULL, NULL, 'first non-null value');
-> returns 'first non-null value'
问题内容: 在这两个条款中,主要区别在于参数传递。因为这是两个参数,我们可以通过合并2或3,但是这两个之间是否还有其他区别?以及它在MSSql中的不同之处。 问题答案: 两者之间的主要区别是该函数接受两个参数,如果不存在则返回第一个,如果第二个则返回第二个。 函数可以采用两个或多个参数,并返回第一个非NULL参数,或者如果所有参数均为null,例如: 更新: MSSQL做更严格的类型和参数检查。此
问题内容: 假设我有两个这样的DataFrame: 我想合并它们,所以我尝试这样的事情: 我很开心 但是我正在尝试使用join方法,我被认为这是非常相似的。 我得到这个: 我想念什么? 问题答案: 我总是在索引上使用: 通过在以下各列上使用,可以具有相同的功能:
什么是区别之间的和?
问题内容: 如果知道只有两个值可以候选列的结果, 和 将给出相同的结果。但是哪个更快?搜索时,我发现了这篇文章,说 ifnull 更快。但这是我发现的唯一文章。有什么看法吗? 提前致谢 :) 问题答案: 我的观点是您应该对使用情况进行基准测试。 我怀疑会有很大的不同。请记住,虽然一个基准可能暗示一个基准稍好一些,但随着时间的推移数据变化可能会改变结果。 还要注意,COALESCE自1992年以来就
问题内容: 我遇到了两种方法来自动增加mysql中的ID。 一个是 SERIAL ,另一个是 AUTOINCREMENT 。 因此,假设我想创建一个表myfriends。我可以通过两种方式创建它: 1) 2) 两者之间有什么区别? 要么 有谁能比别人有优势? 请帮忙。 问题答案: 根据文档 SERIAL是BIGINT UNSIGNED NOT NULL AUTO_INCREMENT UNIQUE的
为什么并行流使用合并器类,而顺序流将使用累加器?为什么并行流不使用累加器? 以下是上述代码的输出: 那么,为什么顺序流使用累加器,并行流使用组合器?并行流不能使用累加器吗?