Domanda

La mia tabella di origine si presenta così

Id     StartDate
1      (null)
2      12/12/2009
3      10/10/2009

Voglio creare una dichiarazione prescelta, che seleziona quanto sopra, ma ha anche una colonna aggiuntiva per visualizzare un varchar se la data non è nullo, come:

Id     StartDate    StartDateStatus
1      (null)       Awaiting
2      12/12/2009   Approved
3      10/10/2009   Approved

Ho il seguente nella mia selezione, ma non sembra funzionare. Tutti gli stati sono impostati per Approved anche se le date sono alcuni valori null

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

I risultati della mia interrogazione assomigliano:

Id     StartDate    StartDateStatus
1      (null)       Approved
2      12/12/2009   Approved
3      10/10/2009   Approved
4      (null)       Approved
5      (null)       Approved

Data iniziale è un smalldatetime, c'è qualche eccezione a come questo dovrebbe essere trattata?

Grazie

È stato utile?

Soluzione

Prova:

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

È il codice sarebbe stato facendo un Quando StartDate = NULL, credo.


NULL è mai uguale a NULL (come NULL è l'assenza di un valore). NULL è inoltre mai non è uguale a NULL. La sintassi è osservato in precedenza ANSI standard SQL e il contrario sarebbe StartDate IS NOT NULL.

È possibile eseguire il seguente:

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

E questo ritorna:

EqualityCheck = 0
InEqualityCheck = 0
NullComparison = 1

Per completezza, in SQL Server è possibile:

SET ANSI_NULLS OFF;

Il che si tradurrebbe in tuoi pari confronti di lavoro in modo diverso:

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

che restituisce:

EqualityCheck = 1
InEqualityCheck = 0
NullComparison = 1

Ma mi raccomando contro questo modo. La gente poi mantenendo il codice potrebbero essere costretti a caccia giù e farti del male ...

Inoltre, non sarà più operare in future versioni di SQL Server:

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

Altri suggerimenti

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top