Моя исходная таблица похожа на это
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
, там некоторое исключение к тому, как это нужно рассматривать?
Спасибо
Попробуйте:
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-сервера: