111

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

合并(x,y)

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

4

8 回答 8

215

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

它只是一个一个地遍历所有参数,并返回第一个即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

它接受几乎任意数量的参数,但它们应该是相同的数据类型。 (如果它们不是相同的数据类型,它们会使用数据类型的优先顺序隐式转换为适当的数据类型。)

这就像ISNULL()但是对于多个参数,而不仅仅是两个。

它也是ANSI-SQL, where-asISNULL()不是。

于 2012-11-13T18:27:05.883 回答
74

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

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

于 2012-11-13T18:40:51.040 回答
18

这是我看待 COALESCE 的方式......希望它是有道理的......

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

合并(字段名,“空”)

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

现在对于多个值...

合并(字段名称 1、字段名称 2、值 2、值 3)

如果 Fieldname1 中的值为 null,则用 Fieldname2 中的值填充,如果 FieldName2 为 NULL,则用 Value2 填充,以此类推。

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

SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
于 2013-09-23T19:43:38.747 回答
4

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

于 2013-07-10T13:52:11.720 回答
3

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

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

它将返回 addressId 和 contactId 都为空的人员。

合并函数

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

例如

  • coalesce(null, 1, 2, 3) 将返回 1。
  • coalesce(null, null) 将返回 null。
于 2017-02-20T10:20:30.237 回答
1

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

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

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

句法:

Coalesce(arg1, arg2, argN...)

注意:除了评估为 NULL 的参数外,所有其他(NOT-NULL)参数必须是相同的数据类型或必须是匹配类型(可以“隐式自动转换”为兼容的数据类型),请参阅示例以下:

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.

高温高压

于 2018-11-16T13:11:12.180 回答
0
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
于 2019-04-30T22:19:59.460 回答
0

coalesce take n number of arguments from left to right. coalesce selects the first non null argument. similarly isnull(field,'unknown') is equivalent to coalesce(field,'unknown') with the difference that coalesce can compare multiple fields.

于 2021-07-21T21:28:27.427 回答