SELECT IFNULL(NULL, 'Replaces the NULL')
--> Replaces the NULL
SELECT COALESCE(NULL, NULL, 'Replaces the NULL')
--> Replaces the NULL
在这两个子句中,主要的区别是参数传递。对于IFNULL
,它是两个参数,对于COALESCE
,是多个参数。除了这一点,我们还有什么别的区别吗?
它在MS中有何不同?
发布于 2013-08-30 08:43:43
两者的主要区别在于,IFNULL
函数接受两个参数,如果不是NULL
,则返回第一个参数;如果第一个参数不是NULL
,则返回第二个参数。
COALESCE
函数可以接受两个或多个参数,并返回第一个非空参数,如果所有参数都为null,则返回NULL
,例如:
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'
发布于 2017-04-04 11:18:30
COALESCE
的优点
COALESCE
是SQL标准函数.
而IFNULL
是特定于MySQL的,它在MSSQL (ISNULL
)中的等效是特定于MSSQL的.COALESCE
可以使用两个或多个参数(实际上,它可以处理单个参数,但在本例中是非常无用的:COALESCE(a)
≡a
)。
而MySQL的IFNULL
和MSSQL的ISNULL
是COALESCE
的有限版本,只能使用两个参数。COALESCE
的缺点
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都不会对其参数进行多次评估。COALESCE
的。
正如我们从前面看到的,关系数据库管理系统中的实际实现各不相同:有些(例如MSSQL)使COALESCE
对其参数进行多次评估,而有些(例如,MySQL、PostgreSQL) --不。
实现与SQL-92兼容。说:“在GROUP子句中不允许这个函数。这个函数的参数不能是查询表达式。”我不知道这些限制是否真的在SQL标准之内;COALESCE
的大多数实际实现(例如MySQL、PostgreSQL)都没有这样的限制。IFNULL
/ISNULL
作为正常函数,也没有这样的限制。继续播放
除非您在特定的关系数据库管理系统中遇到特定的COALESCE
限制,否则我建议始终使用作为更标准和更通用的。
例外情况是:
COALESCE(expr1, …)
可能评估expr1
两次)。GROUP BY
中使用或在c-树中使用查询表达式。发布于 2013-08-30 08:43:00
Server的不同之处
IFNULL()
函数,只有一个类似的ISNULL()
ISNULL
只需要两个参数,而合并则需要可变的参数数。COALESCE
基于ANSI SQL标准,而ISNULL
是专有的TSQL函数。ISNULL
和COALESCE
的验证也不同。例如,NULL
值用于ISNULL
转换为int,而对于COAELSCE
,则必须提供类型。例如:- `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
表达式规则并返回具有最高优先级的值类型。https://stackoverflow.com/questions/18528468
复制相似问题