【问题标题】:COALESCE Function in TSQLSQL 中的 COALESCE 函数
【发布时间】:2012-11-02 05:18:17
【问题描述】:

有人能解释一下 TSQL 中的 COALESCE 函数是如何工作的吗?语法如下

合并(x, y)

关于这个功能的 MSDN 文档很模糊

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql


    【解决方案1】:

    我不确定您为什么认为文档含糊不清。

    它只是一个一个地遍历所有参数,并返回第一个是NOT NULL

    COALESCE(NULL, NULL, NULL, 1, 2, 3)
    => 1
    
    
    COALESCE(1, 2, 3, 4, 5, NULL)
    => 1
    
    
    COALESCE(NULL, NULL, NULL, 3, 2, NULL)
    => 3
    
    
    COALESCE(6, 5, 4, 3, 2, NULL)
    => 6
    
    
    COALESCE(NULL, NULL, NULL, NULL, NULL, NULL)
    => NULL
    

    它接受几乎任意数量的参数,但它们应该是相同的数据类型。 (如果它们不是相同的数据类型,它们会使用 data-type order of precedence 隐式转换为适当的数据类型。)

    类似于ISNULL(),但有多个参数,而不仅仅是两个。

    它也是 ANSI-SQL,而 ISNULL() 不是。

    【讨论】:

    • +1 用于解释数据类型优先级。我相信ISNULL 返回一个与第一个参数具有相同数据类型的值,尽管
    • 您的最后一个代码示例应该给出错误“COALESCE 的至少一个参数必须是类型化的 NULL”来源:sql-server-performance.com/2007/…
    • 文档说了很多,同时还设法提供几乎为零的价值。好的文档提供了一个简单的例子和​​一个简单的结果。 Coalesce 立即进入expressions,与 CASE 比较,与 ISNULL 比较,最后是一个没有结果的示例。然后是一个过于复杂的示例,其中包含太多细节。当我们只需要 5 - 6 行 WTF 的答案时,这件事就是这样。
    【解决方案2】:

    有人告诉我,COALESCE 的成本低于 ISNULL,但研究并未表明这一点。 ISNULL 只接受两个参数,一个是评估为 NULL 的字段,另一个是评估为 NULL 时所需的结果。 COALESCE 将采用任意数量的参数,并返回遇到的第一个非 NULL 值。

    这里有更详尽的细节描述 http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/

    【讨论】:

    • 小心使用ISNULL,它不标准,不太灵活,我读到它总是返回第一个参数的数据类型,而不是像COALESCE那样返回值的数据类型。
    【解决方案3】:

    除了替换 ISNULL 之外,还有很多东西需要合并。我完全同意,coalesce 的官方“文档”含糊不清且没有帮助。这篇文章很有帮助。 http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

    【讨论】:

    • 您链接到的那篇文章极具误导性(正如包括作者在内的几个人在 cmets 部分指出的那样)。他强调的所有巧妙技巧都可以使用 ISNULL 代替 coalesce 来完成。
    【解决方案4】:

    这是我对 COALESCE 的看法……希望它有意义……

    以简单的形式......

    Coalesce(FieldName, 'Empty')

    所以这转换为...如果“FieldName”为 NULL,则使用单词“EMPTY”填充字段值。

    现在是多个值...

    合并(FieldName1, FieldName2, Value2, Value3)

    如果Fieldname1中的值为null,则填写Fieldname2中的值,如果FieldName2为NULL,则填写Value2等

    AdventureWorks2012 示例数据库的这段测试代码完美运行,并且很好地直观地解释了 COALESCE 的工作原理:

    SELECT Name, Class, Color, ProductNumber,
    COALESCE(Class, Color, ProductNumber) AS FirstNotNull
    FROM Production.Product
    

    【讨论】:

      【解决方案5】:

      这是一个包含合并的简单查询 -

      select * from person where coalesce(addressId, ContactId) is null.
      

      它会返回addressId和contactId都为null的人。

      合并函数

      • 至少需要两个参数。
      • 参数必须是整数类型。
      • 返回第一个非空参数。

      例如

      • coalesce(null, 1, 2, 3) 将返回 1。
      • coalesce(null, null) 将 返回 null。

      【讨论】:

        【解决方案6】:

        Coalesce() function 的最简单定义可能是:

        Coalesce() 函数计算所有传递的参数,然后返回参数的第一个实例的值,该参数没有计算为 NULL。

        注意:它评估所有参数,即不跳过返回/NOT NULL 参数右侧的参数的评估。

        语法:

        Coalesce(arg1, arg2, argN...)
        

        当心: 除了评估为 NULL 的参数之外,所有其他(非 NULL)参数必须是相同的数据类型或必须是 matching-types(可以“隐式自动转换”为兼容的数据类型),请参见下面的示例:

        PRINT COALESCE(NULL, ('str-'+'1'), 'x')  --returns 'str-1, works as all args (excluding NULLs) are of same VARCHAR type.
        --PRINT COALESCE(NULL, 'text', '3', 3)    --ERROR: passed args are NOT matching type / can't be implicitly converted.
        PRINT COALESCE(NULL, 3, 7.0/2, 1.99)      --returns 3.0, works fine as implicit conversion into FLOAT type takes place.
        PRINT COALESCE(NULL, '1995-01-31', 'str') --returns '2018-11-16', works fine as implicit conversion into VARCHAR occurs.
        
        DECLARE @dt DATE = getdate()
        PRINT COALESCE(NULL, @dt, '1995-01-31')  --returns today's date, works fine as implicit conversion into DATE type occurs.
        
        --DATE comes before VARCHAR (works):
        PRINT COALESCE(NULL, @dt, 'str')      --returns '2018-11-16', works fine as implicit conversion of Date into VARCHAR occurs.
        
        --VARCHAR comes before DATE (does NOT work):
        PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type, can't auto-cast 'str' into Date type.
        

        HTH

        【讨论】:

          【解决方案7】:
          declare @store table (store_id varchar(300))
          insert into @store 
          values ('aa'),('bb'),('cc')
          declare @str varchar (4000)
          select @str = concat(@str+',',store_id) from @store
          select @str
          

          【讨论】:

          • 我发现这个简单多了。
          【解决方案8】:

          coalesce 从左到右取 n 个参数。 coalesce 选择第一个非空参数。同样isnull(field,'unknown')等价于coalesce(field,'unknown'),区别在于coalesce可以比较多个字段。

          【讨论】:

            猜你喜欢
            • 2023-02-03
            • 1970-01-01
            • 1970-01-01
            • 2014-12-28
            • 1970-01-01
            • 2021-12-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多