私が間違っているCASE文でnullの日付、をチェックしますか?
-
20-09-2019 - |
質問
私のソーステーブルは次のようになります。
Id StartDate
1 (null)
2 12/12/2009
3 10/10/2009
私は、上記の選択select文を作成したいのですが、また、日付のようなnullでない場合は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
開始日は、smalldatetime
ですこれはどう扱われるべきかにはいくつかの例外はありますか?
おかげ
解決
試します:
select
id,
StartDate,
CASE WHEN StartDate IS NULL
THEN 'Awaiting'
ELSE 'Approved' END AS StartDateStatus
FROM myTable
あなたのコードは、ときに開始日= 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 Serverの次期バージョンでは動作しません。
他のヒント
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable
所属していません StackOverflow