CASE当另一个值为null时

时间:2016-10-11 13:23:24

标签: sql tsql

我看过多个例子,但我不明白为什么这个SQL语句说“IS和THEN附近的语法不正确”

我正在尝试根据页面是否已更改来设置status_date列。 因此,如果@page_has_not_changed为null,则status_date应该等于`status_date。

@page_has_not_changed1时,status_date应再次等同status_date

@page_has_not_changed0时,status_date应该等于GETDATE()

这是我的查询。

SET     status_ID = @status_id,
        page_has_not_changed = @page_has_not_changed,
        status_date = CASE @page_has_not_changed
                  --is and null below has syntax issue
                    WHEN IS NULL Then status_date
                    WHEN 1 Then status_date
                    ELSE GETDATE() END,

3 个答案:

答案 0 :(得分:3)

您需要使用备用case语法:

SET     status_ID = @status_id,
        page_has_not_changed = @page_has_not_changed,
        status_date = CASE
                  --is and null below has syntax issue
                    WHEN @page_has_not_changed IS NULL Then status_date
                    WHEN @page_has_not_changed = 1 Then status_date
                    ELSE GETDATE() END

根据the documentation简单CASE表达式(您正在使用的那个)," 仅允许相等检查" 。 IS NULL不是平等检查。

答案 1 :(得分:2)

status_date = CASE WHEN ISNULL(@page_has_not_changed, 1) = 1 
                THEN status_date 
                ELSE GETDATE() 
              END

这样做相同,但在你的情况下只有2个分支。 ISNULL将涵盖@page_has_not_changed为NULL并返回1的情况,使得表达式对NULL和1值都为真。

答案 2 :(得分:1)

将IS NULL删除为NULL,在您的情况下,您已经在检查值,而在WHEN @page_has_not_changed IS NULL中,您正在进行检查

SET ANSI_NULLS OFF
GO

SET     status_ID = @status_id,
        page_has_not_changed = @page_has_not_changed,
        status_date = (CASE @page_has_not_changed
                  --is and null below has syntax issue
                    WHEN NULL Then status_date
                    WHEN 1 Then status_date
                    ELSE GETDATE() END),
                page_has_not_changed = @page_has_not_changed

但是你也应该添加

SET ANSI_NULLS OFF
GO

但是

https://msdn.microsoft.com/en-us/library/ms188048.aspx

  

在SQL Server的未来版本中,ANSI_NULLS将始终为ON,并且将选项明确设置为OFF的任何应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。