проверьте наличие нулевой даты в инструкции CASE, где я ошибся?

StackOverflow https://stackoverflow.com/questions/2453974

Вопрос

Моя исходная таблица выглядит следующим образом

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

Дата начала - это smalldatetime, есть ли какое-то исключение из того, как к этому следует относиться?

Спасибо

Это было полезно?

Решение

Попробуй:

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

Я думаю, ваш код выполнял бы a, когда 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

Другие советы

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top