문제

내 소스 테이블은 다음과 같습니다

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

StartDate는 a입니다 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 Server에서 더 이상 작동하지 않습니다.

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

다른 팁

select Id, StartDate,
Case IsNull (StartDate , '01/01/1800')
When '01/01/1800' then
  'Awaiting'
Else
  'Approved'
END AS StartDateStatus
From MyTable
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top