我看过多个例子,但我不明白为什么这个SQL语句说“IS和THEN附近的语法不正确”
我正在尝试根据页面是否已更改来设置status_date列。
因此,如果@page_has_not_changed
为null,则status_date
应该等于`status_date。
当@page_has_not_changed
为1
时,status_date
应再次等同status_date
。
当@page_has_not_changed
为0
时,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,
答案 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的任何应用程序都将生成错误。避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。