Подтвердить что ты не робот

Проверить нулевую дату в инструкции CASE, где я ошибся?

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

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

Я хочу создать оператор select, который выбирает выше, но также имеет дополнительный столбец для отображения varchar, если дата не равна null, например:

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

Спасибо

4b9b3361

Ответ 1

Try:

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

Ответ 2

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable