Sql 不同值为null时的情况
我已经看过多个示例,但我不明白为什么SQL语句会说“不正确的语法near IS and THEN” 我试图根据页面是否已更改来设置status_date列。 因此,如果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,
@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,不建议这样做,因为他所做的错误已修复,将编辑答案