首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在MySQL中,IFNULL和COALESCE有什么区别?

在MySQL中,IFNULL和COALESCE有什么区别?
EN

Stack Overflow用户
提问于 2013-08-30 08:37:23
回答 5查看 59.6K关注 0票数 91
代码语言:javascript
运行
复制
SELECT IFNULL(NULL, 'Replaces the NULL')
--> Replaces the NULL

SELECT COALESCE(NULL, NULL, 'Replaces the NULL')
--> Replaces the NULL

在这两个子句中,主要的区别是参数传递。对于IFNULL,它是两个参数,对于COALESCE,是多个参数。除了这一点,我们还有什么别的区别吗?

它在MS中有何不同?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-08-30 08:43:43

两者的主要区别在于,IFNULL函数接受两个参数,如果不是NULL,则返回第一个参数;如果第一个参数不是NULL,则返回第二个参数。

COALESCE函数可以接受两个或多个参数,并返回第一个非空参数,如果所有参数都为null,则返回NULL,例如:

代码语言:javascript
运行
复制
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函数,它需要知道参数的类型。因此:

代码语言:javascript
运行
复制
SELECT ISNULL(NULL, NULL);
-> results in an error

SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL

此外,MSSQL中的COALESCE函数至少需要一个参数才是非空的,因此:

代码语言:javascript
运行
复制
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'
票数 105
EN

Stack Overflow用户

发布于 2017-04-04 11:18:30

COALESCE的优点

  • COALESCE 是SQL标准函数. 而IFNULL是特定于MySQL的,它在MSSQL (ISNULL)中的等效是特定于MSSQL的.
  • COALESCE 可以使用两个或多个参数(实际上,它可以处理单个参数,但在本例中是非常无用的:COALESCE(a)a)。 而MySQL的IFNULL和MSSQL的ISNULLCOALESCE的有限版本,只能使用两个参数。

COALESCE的缺点

  • 按照处理SQL文档COALESCE只是CASE的语法糖,可以比更多地计算它的参数。更详细的内容:COALESCE(a1, a2, …, aN)CASE WHEN (a1 IS NOT NULL) THEN a1 WHEN (a2 IS NOT NULL) THEN a2 ELSE aN END。这大大降低了COALESCE在MSSQL中的实用性。 另一方面,MSSQL中的ISNULL是一个正常的函数,它的参数从不超过一次计算。COALESCE in MySQL和PostgreSQL都不会对其参数进行多次评估。
  • 此时,我不知道SQL标准是如何定义COALESCE的。 正如我们从前面看到的,关系数据库管理系统中的实际实现各不相同:有些(例如MSSQL)使COALESCE对其参数进行多次评估,而有些(例如,MySQL、PostgreSQL) --不。 实现与SQL-92兼容。说:“在GROUP子句中不允许这个函数。这个函数的参数不能是查询表达式。”我不知道这些限制是否真的在SQL标准之内;COALESCE的大多数实际实现(例如MySQL、PostgreSQL)都没有这样的限制。IFNULL/ISNULL作为正常函数,也没有这样的限制。

继续播放

除非您在特定的关系数据库管理系统中遇到特定的COALESCE限制,否则我建议始终使用作为更标准和更通用的。

例外情况是:

  • 长时间计算的表达式或在MSSQL中具有副作用的表达式(如,每个文档,COALESCE(expr1, …)可能评估expr1两次)。
  • GROUP BY中使用或在c-树中使用查询表达式。
  • 等。
票数 33
EN

Stack Overflow用户

发布于 2013-08-30 08:43:00

Server的不同之处

  • 没有IFNULL()函数,只有一个类似的ISNULL()
  • ISNULL只需要两个参数,而合并则需要可变的参数数。
  • COALESCE基于ANSI SQL标准,而ISNULL是专有的TSQL函数。
  • ISNULLCOALESCE的验证也不同。例如,NULL值用于ISNULL转换为int,而对于COAELSCE,则必须提供类型。例如:
代码语言:javascript
运行
复制
- `ISNULL(NULL,NULL)` : is int.
- `COALESCE(NULL,NULL)` : will throw an error.
- `COALESCE(CAST(NULL as int),NULL)` : is valid and returns int.

  • 结果表达式的数据类型确定- ISNULL使用第一个参数类型,COALESCE遵循CASE表达式规则并返回具有最高优先级的值类型。
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18528468

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档