shr*_*e18 52 mysql sql sql-server
select ifnull(null,'replaces the null')
-->replaces the null
select coalesce(null,null,'replaces the null')
-->replaces the null
Run Code Online (Sandbox Code Playgroud)
在这两个条款中,主要区别在于论证传递.对于ifnull它的两个参数和合并2或3我们可以通过,除了这两个之间我们有任何其他区别吗?它在MSSql中有何不同.
Ale*_*s G 72
两者之间的主要区别是,IFNULL函数有两个参数,返回的第一个,如果它不是NULL,或者如果第一个是第二NULL.
COALESCEfunction可以接受两个或多个参数并返回第一个非NULL参数,或者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'
Run Code Online (Sandbox Code Playgroud)
更新: MSSQL执行更严格的类型和参数检查.此外,它没有IFNULL功能,而是ISNULL功能,需要知道参数的类型.因此:
SELECT ISNULL(NULL, NULL);
-> results in an error
SELECT ISNULL(NULL, CAST(NULL as VARCHAR));
-> returns NULL
Run Code Online (Sandbox Code Playgroud)
此外COALESCE,MSSQL中的函数至少需要一个参数为非null,因此:
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'
Run Code Online (Sandbox Code Playgroud)
Sas*_*sha 15
COALESCECOALESCE是SQL标准函数.
虽然IFNULL是特定于MySQL的,但它在MSSQL(ISNULL)中的等价物是特定于MSSQL的.
COALESCE可以使用两个或多个参数(事实上,它可以使用单个参数,但在这种情况下是无用的:COALESCE(a)≡ a).
虽然MySQL IFNULL和MSSQL的ISNULL版本有限,COALESCE但只能使用两个参数.
COALESCE每个Transact 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.这大大降低了COALESCEMSSQL 的实用性.
另一方面,ISNULL在MSSQL中是一个普通的函数,并且永远不会多次计算它的参数.COALESCE在MySQL和PostgreSQL中,它们不会多次评估它的参数.
在这个时间点,我不知道SQL标准究竟是如何定义的COALESCE.
正如我们从前一点看到的那样,RDBMS中的实际实现各不相同:有些(例如MSSQL)COALESCE不止一次地评估它的参数,有些(例如MySQL,PostgreSQL) - 不这样做.
c-treeACE 声称它的COALESCE实现与SQL-92兼容,它说:"GROUP BY子句中不允许使用此函数.此函数的参数不能是查询表达式." 我不知道这些限制是否真的符合SQL标准; COALESCE(例如MySQL,PostgreSQL)的大多数实际实现都没有这样的限制.IFNULL/ ISNULL,作为正常功能,也没有这样的限制.
除非您面对特定COALESCERDBMS的特定限制,否则我建议您始终使用COALESCE更标准和更通用的方法.
例外情况是:
COALESCE(expr1, …)可能会评估expr1两次).GROUP BY,或在C-treeACE查询表达式.小智 5
SQL-Server中的差异:
没有IFNULL()功能,但类似ISNULL()
ISNULL 仅接受2个参数,而COALESCE接受可变数量的参数
COALESCE基于ANSI SQL标准,ISNULL但是专有的TSQL函数
为验证ISNULL和COALESCE也不同。例如,将NULLfor的ISNULL值转换为int,而for COAELSCE则必须提供一个类型。例如:
ISNULL(NULL,NULL) :为整数。
COALESCE(NULL,NULL) :将引发错误。
COALESCE(CAST(NULL as int),NULL) :有效并返回int。
确定结果表达式的数据类型– ISNULL使用第一个参数类型,COALESCE遵循CASE表达式规则,并返回具有最高优先级的值的类型。