COALESCE在TSQL中的功能

Llo*_*nks 107 sql t-sql sql-server sql-server-2008

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

COALESCE(x,y)

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

Mat*_*lie 212

我不确定你为什么认为这些文件很模糊.

它只是逐个遍历所有参数,并返回第一个参数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
Run Code Online (Sandbox Code Playgroud)

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

它就像是ISNULL()多个参数,而不仅仅是两个.

它也是ANSI-SQL,在哪里 - ISNULL()不是.

  • 您的上一个代码示例应该给出错误'至少一个COALESCE的参数必须是一个类型为NULL'来源:http://www.sql-server-performance.com/2007/coalesce-argument-must-be-typed -空值/ (5认同)
  • +1有关数据类型优先级的说明.我相信`ISNULL`返回的值与第一个参数的数据类型相同 (4认同)
  • 文档说了很多,同时还设法提供了几乎为零的值。好的文档提供了一个简单的示例,并且结果简单。合并立即进入“表达式”,与CASE比较,与ISNULL比较,最后是一个没有结果的示例。然后是一个过于复杂的示例,其中包含太多细节。当我们需要的只是5到6行WTF的答案时,这件事就做。 (2认同)

小智 73

我被告知COALESCE比ISNULL便宜,但研究并未表明这一点.ISNULL只接受两个参数,即被评估为NULL的字段,以及如果它被评估为NULL所需的结果.COALESCE将接受任意数量的参数,并返回遇到的非NULL的第一个值.

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

  • 谨防使用`ISNULL`,它不标准,不太灵活,我读到它将返回第一个参数的数据类型,而不是返回值的数据类型,如`COALESCE`. (6认同)

Joh*_*ski 18

这是我看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
Run Code Online (Sandbox Code Playgroud)