【发布时间】:2012-11-02 05:18:17
【问题描述】:
有人能解释一下 TSQL 中的 COALESCE 函数是如何工作的吗?语法如下
合并(x, y)
关于这个功能的 MSDN 文档很模糊
【问题讨论】:
标签: sql sql-server sql-server-2008 tsql
有人能解释一下 TSQL 中的 COALESCE 函数是如何工作的吗?语法如下
合并(x, y)
关于这个功能的 MSDN 文档很模糊
【问题讨论】:
标签: sql sql-server sql-server-2008 tsql
我不确定您为什么认为文档含糊不清。
它只是一个一个地遍历所有参数,并返回第一个是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() 不是。
【讨论】:
ISNULL 返回一个与第一个参数具有相同数据类型的值,尽管
expressions,与 CASE 比较,与 ISNULL 比较,最后是一个没有结果的示例。然后是一个过于复杂的示例,其中包含太多细节。当我们只需要 5 - 6 行 WTF 的答案时,这件事就是这样。
有人告诉我,COALESCE 的成本低于 ISNULL,但研究并未表明这一点。 ISNULL 只接受两个参数,一个是评估为 NULL 的字段,另一个是评估为 NULL 时所需的结果。 COALESCE 将采用任意数量的参数,并返回遇到的第一个非 NULL 值。
这里有更详尽的细节描述 http://www.mssqltips.com/sqlservertip/2689/deciding-between-coalesce-and-isnull-in-sql-server/
【讨论】:
ISNULL,它不标准,不太灵活,我读到它总是返回第一个参数的数据类型,而不是像COALESCE那样返回值的数据类型。
除了替换 ISNULL 之外,还有很多东西需要合并。我完全同意,coalesce 的官方“文档”含糊不清且没有帮助。这篇文章很有帮助。 http://www.mssqltips.com/sqlservertip/1521/the-many-uses-of-coalesce-in-sql-server/
【讨论】:
这是我对 COALESCE 的看法……希望它有意义……
以简单的形式......
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
【讨论】:
这是一个包含合并的简单查询 -
select * from person where coalesce(addressId, ContactId) is null.
它会返回addressId和contactId都为null的人。
合并函数
例如
【讨论】:
Coalesce() function 的最简单定义可能是:
Coalesce() 函数计算所有传递的参数,然后返回参数的第一个实例的值,该参数没有计算为 NULL。
注意:它评估所有参数,即不跳过返回/NOT NULL 参数右侧的参数的评估。
语法:
Coalesce(arg1, arg2, argN...)
当心: 除了评估为 NULL 的参数之外,所有其他(非 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 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.
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
【讨论】:
coalesce 从左到右取 n 个参数。 coalesce 选择第一个非空参数。同样isnull(field,'unknown')等价于coalesce(field,'unknown'),区别在于coalesce可以比较多个字段。
【讨论】: