在mysql中ifnull和coalesce有什么区别?

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)

  • 一个挑剔:你在MSSQL中的`COALESCE`中至少不需要一个非空值.您不能只使用`NULL`常量,但所有值都可以为null(查询中为fe).所以这没关系:`COALESCE(NULL,ValueWhichIsNULL)`.演示:http://sqlfiddle.com/#!6/3f5c7/2/0 (9认同)

Sas*_*sha 15

优点 COALESCE

  • COALESCE是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更标准和更通用的方法.

例外情况是:

  • 在MSSQL中长期计算的表达式或带有副作用的表达式(因为,根据文档,COALESCE(expr1, …)可能会评估expr1两次).
  • 内使用GROUP BY,或在C-treeACE查询表达式.
  • 等等.


小智 5

SQL-Server中的差异:

  • 没有IFNULL()功能,但类似ISNULL()

  • ISNULL 仅接受2个参数,而COALESCE接受可变数量的参数

  • COALESCE基于ANSI SQL标准,ISNULL但是专有的TSQL函数

  • 为验证ISNULLCOALESCE也不同。例如,将NULLfor的ISNULL值转换为int,而for COAELSCE则必须提供一个类型。例如:

    • ISNULL(NULL,NULL) :为整数。

    • COALESCE(NULL,NULL) :将引发错误。

    • COALESCE(CAST(NULL as int),NULL) :有效并返回int。

  • 确定结果表达式的数据类型– ISNULL使用第一个参数类型,COALESCE遵循CASE表达式规则,并返回具有最高优先级的值的类型。

  • @ypercube然后他需要在回答中明确说明。OP的问题标题是_ ifnull和mysql中的合并之间有什么区别?_-您在那里看到sql-server吗? (4认同)
  • 你错了。`COALESCE(NULL,NULL)`不会抛出错误-它会返回`NULL`。此外,OP正在询问“ IFNULL”功能,而不是“ ISNULL”功能-请仔细阅读问题。哦,并且NULL永远不会转换为int。 (2认同)
  • @AleksG praba正在回答有关SQL Server的问题,其中`COALESCE(NULL,NULL)`确实会引发错误:[SQL-Fiddle](http://sqlfiddle.com/#!3/d41d8/19759) (2认同)