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
扩展到,CASE
但显然在CASE
声明中,您自己编写即可在WHEN
条件上更加灵活。对于ISNULL
VSCOALESCE
相关/复制?