检查CASE语句中的空日期,哪里出错了?

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


Bub*_*bba 5

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)