web-dev-qa-db-ja.com

CASEステートメントでnull日付を確認します。どこで間違っていますか?

私のソーステーブルは次のようになります

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ですが、これをどのように扱うべきかについていくつかの例外はありますか?

ありがとう

31
Jimmy

試してください:

select
     id,
     StartDate,
CASE WHEN StartDate IS NULL
    THEN 'Awaiting'
    ELSE 'Approved' END AS StartDateStatus
FROM myTable

あなたのコードは、StartDate = NULLの場合を実行していたと思います。


NULLNULLと等しくなることはありません(NULLは値がないため)。 NULLNULLと等しくなることはありません。上記の構文は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

71
Paddy
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
3
Bubba