37

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

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日付にnullが含まれていても、すべてのステータスがに設定されます

        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これをどのように処理するかについて例外はありますか?

ありがとう

4

2 に答える 2

82

試す:

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

あなたのコードは When 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 サーバーでは機能しなくなります。

https://msdn.microsoft.com/en-GB/library/ms188048.aspx

于 2010-03-16T11:45:53.097 に答える
5
select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
于 2012-08-29T19:25:26.240 に答える