2012-06-12 2 views
1

SQL Server 2005 사용.여러 열의 Null 필터링

데이터가 2 개의 별도 테이블에 있으며 쓰기 권한이 있습니다.

DateTime1 | DateTime2 
----------------------- 
2012-06-01 | 2012-06-01 
2012-06-02 | 2012-06-02 
2012-06-04 | 2012-06-05 
2012-06-02 | NULL 
NULL  | 2012-06-05 
2012-06-04 | 2012-06-05 
NULL  | NULL 

내가 DateTime1 및 DATETIME2이 값을 포함하는 값을 계산 할 수있다 할 노력하고 있어요 것은, DateTime1 날짜를 포함하고 DATETIME2가 NULL, DateTime1은 NULL이며 DATETIME2 포함 : 같은

데이터 보인다 값.

전체적으로 나는 DateTime1이 Null이고 DateTime2가 null이되는 것을 피하려고 노력하고 있습니다.

문은 다음과 같습니다 :

Where (DateTime1 is not null or DateTime2 is not null) 

유일한 문제는 모두 null 값이 어디에 여전히 게재되고있다. 왜 이것이 일어날 지 또는 해결 방법을 아는 사람은 누구입니까?

감사

편집 전체 쿼리를 @Lamak의 요청에 따라

;With [CTE] As (
Select 
    TH.ID 
    ,AMT 
    ,Reason 
    ,EffDate 
    ,DateReq 
    ,CS_ID 
    ,ROW_NUMBER() 
     Over (Partition By ID Order By [pthPrimeKey] Desc) as [RN] 
From 
    DateTime1Table as [MC] (nolock) 
    Left Join History as [TH] (nolock) on [TH].[ID] = [MC].[ID] 
    Left Join Trans as [SUB] (nolock) on [SUB].TransactionReasonCode = [TH].Reason 
    Left Join Renew as [RM] (nolock) on [MC].ID = [RM].ID 
Where 
    ([MC].[DateTime1] is not null or [RM].[DateTime2] is not null) 
    And [PostingDate] = DATEADD(dd, datediff(dd, 1, GetDate()),0) 
) 
SELECT 
[ID] 
,[AMT] as [Earned] 
,[Reason] as [Reason] 
,[EffDate] as [Eff] 
,[DateReq] as [Date_Cancel_Req] 
,[pthUserId_Number] as [CSR] 
FROM [CTE] 
Where RN <= 1 
+1

당신의'어디서 '괜찮습니까, 문제는 다른 뭔가 여야합니다. 그 값이 실제로'NULL'인지 확신 할 수 있습니까?,'DATETIME' 데이터 타입의 열입니까? 'NULL'' 문자열이있을 수 있기 때문입니다 – Lamak

+0

@GSerg - 왜?, s/he 만 두 열이 모두 NULL이고 where it이 무엇을하고 있는지 결과를 필터링해야합니다. – Lamak

+0

@Lamak 열은 DateTime이며 문자열 값은 NULL 값이 아니며 실제 NULL 값입니다. – Brad

답변

4

  • 만 DateTime1에 값이있는 경우 다음 행을 포함 할 수

  • DateTime2의 값은
  • 입니다.
  • 모두 값이 있습니다.

두 값이 모두 NULL 인 행은 제외됩니다. 그게 네가 쫓아 온거야? (대화를 따르려고했으나 길을 잃어 버렸고 샘플 데이터로 더 간단한 재현을 원한다. CTE와 다른 모든 조인과 논리가 실제 문제가 실제로 해결되었다고 생각한다.)

당신이 LEFT OUTER JOIN을 수행하고 있기 때문에
WHERE COALESCE([MC].[DateTime1], [RM].[DateTime2]) IS NOT NULL 

그러나,이 [RM] 대신 WHEREON 절에 속할 수 있습니다. 그렇지 않으면 일치하는 행의 값이 NULL이거나 일치하는 행이 없기 때문에 행이 제외되었는지 여부를 알 수 없습니다. 그리고 어쩌면 그건 괜찮아요, 제가 그걸 언급 할 거라 생각 했어요.

물론 편집

, 그 절과 동일한 결과를 제공합니다 ...

WHERE ([MC].[DateTime1] is not null or [RM].[DateTime2] is not null) 

증거를 원하십니까?

DECLARE @a TABLE(id INT, DateTime1 DATETIME); 
DECLARE @b TABLE(id INT, DateTime2 DATETIME); 

INSERT @a SELECT 1, '20120602' ; INSERT @b SELECT 1, NULL; 
INSERT @a SELECT 2, NULL  ; INSERT @b SELECT 2, '20120605'; 
INSERT @a SELECT 3, '20120604' ; INSERT @b SELECT 3, '20120605'; 
INSERT @a SELECT 4, NULL  ; INSERT @b SELECT 4, NULL; 
INSERT @a SELECT 5, '20120602' ; INSERT @b SELECT 9, NULL; 
INSERT @a SELECT 6, NULL  ; INSERT @b SELECT 10, '20120605'; 
INSERT @a SELECT 7, '20120604' ; INSERT @b SELECT 11, '20120605'; 
INSERT @a SELECT 8, NULL  ; INSERT @b SELECT 12, NULL; 

SELECT * FROM @a AS a LEFT OUTER JOIN @b AS b 
ON a.id = b.id 
WHERE COALESCE(a.DateTime1, b.DateTime2) IS NOT NULL; 

SELECT * FROM @a AS a LEFT OUTER JOIN @b AS b 
ON a.id = b.id 
WHERE a.DateTime1 IS NOT NULL OR b.DateTime2 IS NOT NULL; 

두 쿼리 산출 : 당신은 당신이 기대하는 행을 표시되지 않는 경우

id DateTime1 id DateTime2 
-- ---------- ---- ---------- 
1 2012-06-02 1 NULL  -- because left is not null 
2 NULL  2 2012-06-05 -- because right is not null 
3 2012-06-04 3 2012-06-05 -- because neither is null 
5 2012-06-02 NULL NULL  -- because of no match 
7 2012-06-04 NULL NULL  -- because of no match 

그래서 코멘트에 제안, 쿼리의 다른 부분에서 볼 필요가있다. 샘플 데이터와 원하는 결과를 제공하면이를 좁힐 수 있습니다. 그렇다고해서 문제가 어디 있는지 판단하기 위해 스키마와 데이터에 대해 충분히 알지 못한다고 생각합니다.

+0

Im 왜 테스트 데이터를 기반으로 작동하는지 알 수는 없지만 병합하면 트릭을 만들었습니다. 고맙습니다! – Brad