案例与虚无与融合


9

我正在阅读SQL Server 2012考试的文档,发现了以下几点:

案例与虚无与融合

现在,我知道如何使用每个,但不知道何时使用。请可以澄清一下。谢谢。

附言 请给我们一个考试题标签吗?


2
COALESCE扩展到,CASE但显然在CASE声明中,您自己编写即可在WHEN条件上更加灵活。对于ISNULLVS COALESCE 相关/复制?
马丁·史密斯

相关我同意。但不是dup。感谢您的评论:)
Stuart Blackler 2012年

Answers:


10

ISNULL-仅在SQL Server中可用。允许测试和将NULL值彼此替换。

COALESCE -ANSI标准。允许测试和使用可变长度参数集中的第一个非空值替换NULL值。重要的是要注意数据类型优先因素

-- Conversion failed when converting the varchar value 'a' to data type int
SELECT COALESCE(CAST(NULL AS varchar(10)), 'a', 1) 
-- Returns 1
SELECT COALESCE(CAST(NULL AS varchar(10)), 1, 'a')

在上面的示例中,“ a”是第一个非空值,但字符数据的优先级低于整数。

ISNULL与COALESCE之间的另一个考虑是,将ISNULL的结果确定为NOT NULL,而COALESCE调用的结果为NULLable。请参阅JRJ的文章ISNULL()<> COALESCE()虽然这似乎是一件微不足道的事情,但查询优化器可以根据列的可空性制定不同的计划。

您可以通过dmo sys.dm_exec_describe_first_result_set运行它来轻松测试null / coalesce / case表达式的可为空性

-- these all evaluate to not nullable (is_nullable = 0) because I'm not clever enough
DECLARE @sql nvarchar(4000) = N'
SELECT ISNULL(NULL, 1) AS I
, COALESCE(NULL, 1) AS C
, CASE WHEN NULL = NULL THEN NULL ELSE 1 END AS C1
'
SELECT
    DMO.*
FROM
    sys.dm_exec_describe_first_result_set(@sql, NULL, 0) AS DMO

案例 -也是ANSI标准标量函数。我承认,当我有一个无法用简单的标量表示的测试时,我会在前两个示例中使用CASE,但我承认这是一个很弱的答案。


非常感谢您提供完整的答案。我不知道优先顺序很重要COALESCE。再次感谢
Stuart Blackler

1
CASE从技术上讲是一个表达式,而不是一个函数。
ypercubeᵀᴹ

1

ISNULL使您可以返回1个补货,而COALESCE不限于一个值,例如,COALESCE(v1,v2,v3,v4,v5) 如果V5是唯一一个非空值,则将返回

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.