2010-03-16 3 views
25

내 소스 테이블처럼 보이는이CASE 문에서 날짜가 잘못되었는지 확인합니다. 어디에서 잘못 되었습니까?

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

날짜가 같은 null가 아닌 경우 I 위를 선택하는 선택 문을 생성 할뿐만 아니라 VARCHAR를 표시하는 추가 열이 있습니다

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

내 선택에 다음과 같은 사항이 있지만 작동하지 않는 것 같습니다. 날짜는 일부 널 (null) 내 쿼리의

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

결과의 모습에도 불구하고 모든 상태가 Approved로 설정됩니다

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

STARTDATE가 smalldatetime이다, 방법이해야 몇 가지 예외가있다 대우받을까요?

감사

답변

58

보십시오, 내가 생각할 때 STARTDATE = NULL

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

당신의 코드가 수행되었을 것입니다. (NULL이 값의 부재이기 때문에)


NULLNULL에 결코 동일하다. 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 

그리고 이것은 반환

SET ANSI_NULLS OFF; 

하는 것이 될 것입니다 : 당신이 할 수있는 SQL Server의 완전성을 위해서

EqualityCheck = 0 
InEqualityCheck = 0 
NullComparison = 1 

당신의 동등한 비교에서 일하는 차이 ntly :

EqualityCheck = 1 
InEqualityCheck = 0 
NullComparison = 1 

하지만 내가보기 엔이 일에 대해 추천 할 것입니다 :

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 

반환합니다.

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

+0

가 왜을 수행 후에 코드를 유지하는 사람들은

또한

, 더 이상 SQL 서버의 향후 버전에서 작동하지 않습니다 ... 아래를 사냥하고 상처를 강요 될 수있다 "ColumnName = NULL"이 작동하지 않습니다? 그런 구문이 왜 받아 들여지지 않습니까? –

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

StartDate = '01/01/1800 '이면 결과는'대기 중 '이됩니다. – Xordal