Sql 不同值为null时的情况

Sql 不同值为null时的情况,sql,tsql,Sql,Tsql,我已经看过多个示例,但我不明白为什么SQL语句会说“不正确的语法near IS and THEN” 我试图根据页面是否已更改来设置status_date列。 因此,如果@page\u has\u not\u change为空,则status\u date应等于'status\u date' 当@page\u未更改时为1,则状态日期应再次等于状态日期 当@page\u未更改时为0则状态日期应等于GETDATE() 这是我的问题 SET status_ID = @status_id,

我已经看过多个示例,但我不明白为什么SQL语句会说“不正确的语法near IS and THEN”

我试图根据页面是否已更改来设置status_date列。 因此,如果
@page\u has\u not\u change
为空,则
status\u date
应等于'status\u date'

@page\u未更改时
1
,则
状态日期
应再次等于
状态日期

@page\u未更改时
0
状态日期
应等于
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,

您需要使用备用的
大小写
语法:

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

根据,简单的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

根据,简单的CASE表达式(您正在使用的表达式)“仅允许相等检查”
为NULL
不是相等检查。

删除为NULL到NULL,在您的情况下,您已经在检查值,而在@page\u未更改为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
但是

在SQL Server的未来版本中,ANSI_NULLS将始终处于打开状态,任何显式将该选项设置为关闭的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序


Remove为NULL到NULL,在您的情况下,您已经在检查值,而在@page\u has\u not\u change为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
但是

在SQL Server的未来版本中,ANSI_NULLS将始终处于打开状态,任何显式将该选项设置为关闭的应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序

这与此相同,但在您的案例中只有2个分支。
ISNULL
将涵盖
@page\u has\u not\u change
为NULL的情况,并返回1,使表达式对NULL和1值都为真



这与此相同,但在您的案例中只有2个分支。
ISNULL
将涵盖
@page\u has\u not\u change
为NULL的情况,并返回1,使表达式对NULL和1值均为真。

我想接下来的更大问题是为什么其他语法有时有效,但此语法有时有效。@christopherclark感谢您的评论。我阅读了文档,明白了为什么简单的案例陈述不起作用。实际上,我只是在…时才使用了
大小写,并没有意识到还有更简单的选择。我想接下来更大的问题是,为什么其他语法有时有效,而这个语法有时有效。@christopherclark感谢您的评论。我阅读了文档,明白了为什么简单的案例陈述不起作用。实际上,我只是在…
时才使用了
案例,并没有意识到还有更简单的选择。如果是
0
。页面已更改,我需要更新状态DateChanged。如果为空,请让ISNULL返回1&检查1。如果为
0
。页面已更改,我需要更新状态DateChanged。如果为NULL,请让ISNULL返回1&检查1。@christorclark我认为这回答了您的问题,即为什么您的查询实际上没有返回1work@christopherclark奇怪的你们能看看吗?对我来说,它在SQL Server 2012中返回了错误的结果。@w0lf您需要设置ANSI_NULL,因为它为NULL=NULL@brykneval好的,现在我明白了。但您的答案中可能应该指定设置此选项的假设。@w0lf true,不建议这样做,因为他所做的错误将被修改answer@christopherclark我想这回答了你的问题,为什么你的问题实际上没有work@christopherclark奇怪的你们能看看吗?对我来说,它在SQL Server 2012中返回了错误的结果。@w0lf您需要设置ANSI_NULL,因为它为NULL=NULL@brykneval好的,现在我明白了。但您的答案中可能应该指定设置此选项的假设。@w0lf true,不建议这样做,因为他所做的错误已修复,将编辑答案