Stu*_*ler 9 sql-server sql-server-2012
我只是在阅读 SQL Server 2012 考试的文档,我看到了以下几点:
case 与 isnull 与合并
现在,我知道如何使用每一种,但我不知道何时使用每一种。请一些机构澄清。谢谢。
附言。请问我们可以有一个考试问题的标签吗?
bil*_*nkc 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')
Run Code Online (Sandbox Code Playgroud)
在上面的例子中,'a' 是第一个非空值,但字符数据的优先级低于整数。
ISNULL 与 COALESCE 之间的另一个考虑因素是 ISNULL 的结果被确定为 NOT NULL 而 COALESCE 调用的结果是 NULLable。请参阅 JRJ 的帖子ISNULL() <> COALESCE()虽然这看起来微不足道,但查询优化器可以根据列的可空性制定不同的计划。
您可以通过 dmo sys.dm_exec_describe_first_result_set轻松测试 isnull/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
Run Code Online (Sandbox Code Playgroud)
CASE - 也是 ANSI 标准标量函数。当我有一个无法用简单的标量表示的测试时,我会考虑在前两个中使用 CASE,但我承认这是一个非常弱的答案。