有人可以解释TSQL中的COALESCE功能是如何工作的吗?语法如下
COALESCE(x,y)
关于此功能的MSDN文档非常模糊
答案 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都为空的人。
合并功能
e.g。
答案 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