проверьте на пустую дату В СЛУЧАЕ, ЕСЛИ оператор, где я пошел не так, как надо?

Моя исходная таблица похожа на это

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 является a smalldatetime, там некоторое исключение к тому, как это нужно рассматривать?

Спасибо

32
задан Jimmy 16 March 2010 в 11:43
поделиться

1 ответ

Попробуйте:

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

72
ответ дан 27 November 2019 в 20:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: