处理CASE表达式中的NULL值

时间:2015-03-05 14:25:45

标签: sql-server

当我使用CASE WHEN时,我在其中一个存储过程中发现了错误。

CREATE PROCEDURE sp_test 
    @a varchar(4) = NULL,
    @b  varchar(4) = NULL
AS
    UPDATE testtable
    SET a = CASE @a
               WHEN NULL THEN var1
               WHEN 'NULL' THEN NULL
               ELSE @a
            END,
    SET b = CASE @b
               WHEN NULL THEN b
               WHEN 'NULL' THEN NULL
               ELSE @b
            END
GO

如果我传递一个变量字符串" NULL",我的目标是将所述字段更新为NULL,如果我不放参数,它将更新任何内容/设置更新为其自己的值,否则,更新给定的值参数。

此存储过程修复了我的CASE

CREATE PROCEDURE sp_test 
    @a varchar(4) = NULL,
    @b  varchar(4) = NULL
AS
    UPDATE testtable
    SET a = CASE 
              WHEN @a IS NULL THEN var1
              WHEN @a = 'NULL' THEN NULL
              ELSE @a
            END,
    SET b = CASE 
              WHEN @b IS NULL THEN b
              WHEN @b = 'NULL' THEN NULL
              ELSE @b
            END
GO

为什么后者有效,而前者没有?

1 个答案:

答案 0 :(得分:0)

因为第二个检查“IS NULL”,其中第一个是隐式“= NULL”。任何时候你有任何值和NULL相等,它将始终为NULL。在你的第一个案例表达式中,条件不会评估为真,因为NULL<>是真还是假。


关闭主题,但是...我注意到你的程序前缀为sp_,这是你应该尝试改变的习惯。一般来说,前缀对我来说似乎很愚蠢,但sp_前缀是为系统过程保留的。如果MS发布了一个proc并且存在命名冲突,则系统过程将运行而不是您的系统过程。如果您在执行时未指定架构,它也会慢一点,因为引擎将首先搜索msdb。这是一篇关于这个主题的精彩文章。 http://sqlperformance.com/2012/10/t-sql-queries/sp_prefix