проверить на нулевую дату в заявлении CASE, где я ошибся? - PullRequest
30 голосов
/ 16 марта 2010

Моя исходная таблица выглядит так

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, есть ли исключения из того, как это следует обрабатывать?

Спасибо

Ответы [ 2 ]

69 голосов
/ 16 марта 2010

Попробуйте:

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

Я думаю, что ваш код делал бы, когда 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;

Что привело бы к тому, что ваши сравнения равных работают иначе:

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-сервера:

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

3 голосов
/ 29 августа 2012
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
...