Jim*_*mmy 32 sql sql-server-2005 case smalldatetime
我的源表看起来像这样
Id StartDate
1 (null)
2 12/12/2009
3 10/10/2009
Run Code Online (Sandbox Code Playgroud)
我想创建一个选择上面的select语句,但是如果日期不为null,还有一个额外的列来显示varchar,例如:
Id StartDate StartDateStatus
1 (null) Awaiting
2 12/12/2009 Approved
3 10/10/2009 Approved
Run Code Online (Sandbox Code Playgroud)
我的选择中有以下内容,但它似乎不起作用.Approved
即使日期有一些空值,所有状态都会设置为
select
id,
StartDate,
CASE StartDate
WHEN null THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Run Code Online (Sandbox Code Playgroud)
我的查询结果如下:
Id StartDate StartDateStatus
1 (null) Approved
2 12/12/2009 Approved
3 10/10/2009 Approved
4 (null) Approved
5 (null) Approved
Run Code Online (Sandbox Code Playgroud)
StartDate是一个smalldatetime
,应该如何处理它有一些例外吗?
谢谢
Pad*_*ddy 72
尝试:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
Run Code Online (Sandbox Code Playgroud)
我认为你的代码一直在做一个StartDate = NULL.
NULL
永远不等于NULL
(因为NULL是没有值). NULL
也永远不等于NULL
.上面提到的语法是ANSI SQL标准,反之亦然StartDate IS NOT NULL
.
您可以运行以下命令:
SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck,
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck,
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison
Run Code Online (Sandbox Code Playgroud)
这会返回:
EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1
Run Code Online (Sandbox Code Playgroud)
为了完整起见,在SQL Server中,您可以:
SET ANSI_NULLS OFF;
Run Code Online (Sandbox Code Playgroud)
这将导致您的等于比较的工作方式不同:
SET ANSI_NULLS OFF
SELECT CASE WHEN (NULL = NULL) THEN 1 ELSE 0 END AS EqualityCheck,
CASE WHEN (NULL <> NULL) THEN 1 ELSE 0 END AS InEqualityCheck,
CASE WHEN (NULL IS NULL) THEN 1 ELSE 0 END AS NullComparison
Run Code Online (Sandbox Code Playgroud)
哪个回报:
EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1
Run Code Online (Sandbox Code Playgroud)
但我强烈建议不要这样做.人们随后维护你的代码可能会被迫追捕并伤害你......
此外,它将不再适用于即将发布的SQL Server版本:
https://msdn.microsoft.com/en-GB/library/ms188048.aspx
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable
Run Code Online (Sandbox Code Playgroud)