проверьте наличие нулевой даты в инструкции CASE, где я ошибся?
-
20-09-2019 - |
Вопрос
Моя исходная таблица выглядит следующим образом
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:
Другие советы
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable