私のソーステーブルは次のようになります
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
Selectに次のものがありますが、機能していないようです。日付にヌルが含まれている場合でも、すべてのステータスが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は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サーバーでは機能しなくなります。
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
'Awaiting'
Else
'Approved'
END AS StartDateStatus
From MyTable