SQL中的COALESCE函数

时间:2012-11-13 18:25:49

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

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

  

COALESCE(x,y)

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

8 个答案:

答案 0 :(得分:209)

我不确定您认为文档模糊的原因。

它只是逐个遍历所有参数,并返回第一个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 :(得分:73)

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

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

答案 2 :(得分:17)

这是我看COALESCE的方式......希望它有意义......

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

合并(FieldName,'空')

所以这转化为......如果" 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

答案 3 :(得分:3)

除了ISNULL的替代品之外,还有很多东西可以合并。我完全同意官方"文件"合并是模糊和无益的。这篇文章有很多帮助。 http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/

答案 4 :(得分:2)

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

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

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

合并功能

  • 至少有两个论点。
  • 参数必须是整数类型。
  • 返回第一个非null参数。

e.g。

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

答案 5 :(得分:0)

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

  

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

注意:它会评估所有参数,即不会跳过对返回/非空参数右侧的参数的评估。

语法:

Coalesce(arg1, arg2, argN...)

当心: 除那些评估为NULL的参数外,所有其他(NOT-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 into VARCHAR occurs.

--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt)      --ERROR: passed args are NOT matching type

HTH

答案 6 :(得分:0)

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

答案 7 :(得分:-1)

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