37

我的源表看起来像这样

Id     StartDate
1      (null)
2      12/12/2009
3      10/10/2009

我想创建一个选择语句,它选择上面的内容,但如果日期不为空,还有一个额外的列来显示一个 varchar,例如:

Id     StartDate    StartDateStatus
1      (null)       Awaiting
2      12/12/2009   Approved
3      10/10/2009   Approved

我的选择中有以下内容,但它似乎不起作用。Approved即使日期有一些空值,所有状态都设置为

        select
             id,
             StartDate,
        CASE StartDate
        WHEN null THEN 'Awaiting'
        ELSE 'Approved' END AS StartDateStatus
        FROM myTable

我的查询结果如下:

Id     StartDate    StartDateStatus
1      (null)       Approved
2      12/12/2009   Approved
3      10/10/2009   Approved
4      (null)       Approved
5      (null)       Approved

StartDate 是一个smalldatetime,这应该如何处理有一些例外吗?

谢谢

4

2 回答 2

82

尝试:

select
     id,
     StartDate,
CASE WHEN StartDate IS NULL
    THEN 'Awaiting'
    ELSE 'Approved' END AS StartDateStatus
FROM myTable

我认为,您的代码会一直执行 When 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

这会返回:

EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1

为了完整起见,在 SQL Server 中,您可以:

SET ANSI_NULLS OFF;

这将导致您的 equals 比较工作方式不同:

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

返回:

EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1

但我强烈建议不要这样做。随后维护您的代码的人可能会被迫追捕您并伤害您...

此外,它将不再适用于即将发布的 SQL Server 版本:

https://msdn.microsoft.com/en-GB/library/ms188048.aspx

于 2010-03-16T11:45:53.097 回答
5
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
于 2012-08-29T19:25:26.240 回答