有人可以解释在TSQL的COALESCE功能是如何工作的? 语法如下
COALESCE(X,Y)
在这个函数的MSDN文档是很模糊
有人可以解释在TSQL的COALESCE功能是如何工作的? 语法如下
COALESCE(X,Y)
在这个函数的MSDN文档是很模糊
我已经告诉COALESCE比ISNULL成本较低,但研究并不表示。 ISNULL只需要两个参数,现场正在评估NULL,和你想要的结果,如果它是为NULL评估。 COALESCE将采取任何数量的参数,返回的第一个值遇到不为空。
还有这里的细节进行更全面的描述http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
我不知道为什么你认为该文档是模糊的。
它只是遍历所有参数一个接一个,并返回第一个是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
,其中,作为ISNULL()
不是。
这是我看COALESCE的方式......并希望这是有道理的...
在一个简单的形式...。
聚结(字段名,“空”)
所以这样的语句...如果“字段名”为NULL,填充字“空”字段值。
现在对于复式值...
合并(FieldName1,FieldName2,值2,值3)
如果Fieldname1值为空,在Fieldname2值填充它,如果FieldName2为NULL,与值2等填充
这对于AdventureWorks2012示例数据库片的测试代码工作完全与给出的COALESCE是如何工作的一个良好的视觉解释:
SELECT Name, Class, Color, ProductNumber,
COALESCE(Class, Color, ProductNumber) AS FirstNotNull
FROM Production.Product
有很多不仅仅是对ISNULL更换凝聚。 我完全同意峰结合官方“文档”是模糊的,也是无益的。 本文将有很大帮助。 http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
下面是一个包含COALESCE一个简单的查询 -
select * from person where coalesce(addressId, ContactId) is null.
它会返回其中两个addressId和使用ContactID是空的人。
合并功能
如
的的最简单的定义COALESCE()函数可以是:
COALESCE()函数的计算结果是所有参数,然后返回的结果不是空的说法一审的价值。
注意:它评估所有的参数,即不会在返回/ NOT NULL参数的右侧跳过参数(S)的评价。
句法:
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 into VARCHAR occurs.
--VARCHAR comes before DATE (does NOT work):
PRINT COALESCE(NULL, 'str', @dt) --ERROR: passed args are NOT matching type
HTH
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