当前位置: 首页 > 知识库问答 >
问题:

在MySQL中,IFNULL和合并有什么区别?

蓟浩旷
2023-03-14
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中有何不同?

共有3个答案

子车新立
2023-03-14

SQL-服务器的区别:

>

  • 没有 IFNULL() 函数,但有一个类似的异号()

    < code>ISNULL只接受2个参数,而COALESCE接受可变数量的参数

    COALESCE基于ANSISQL标准,而ISNULL是专有的TSQL函数

    ISNULLCOALESCE的验证也不同。例如,ISNULLNULL值转换为int,而对于COAELSCE,您必须提供类型。例如:

    >

  • 国际素(空,空) : 是整数。

    COALESCE(NULL, NULL):将抛出错误。

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

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

  • 萧自珍
    2023-03-14

    >

  • 合并是 SQL 标准函数

    而< code>IFNULL是特定于MySQL的,它在MSSQL中的对等用法(< code>ISNULL)是特定于MSSQL的。

    < code>COALESCE可以处理两个或更多参数(实际上,它可以处理单个参数,但在这种情况下几乎没有用:< code > COALESCE(a)≡< code > a )。

    而MySQL的 IFNULL和MSSQL的ISNULLCOLESCE的有限版本,只能使用两个参数。

    >

  • 每个事务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,因为它更标准、更通用。

    例外情况是:

    • 长计算表达式或MSSQL中具有副作用的表达式(根据文档,COALESCE(expr1,…)可能会对expr1求值两次)
    • 在<code>GROUP BY</code>中或在c-treeACE中与查询表达式一起使用
    • 等等

  • 桂丰
    2023-03-14

    两者之间的主要区别在于< 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的

    • 为什么并行流使用合并器类,而顺序流将使用累加器?为什么并行流不使用累加器? 以下是上述代码的输出: 那么,为什么顺序流使用累加器,并行流使用组合器?并行流不能使用累加器吗?