簡體   English   中英

從多列中過濾空值

[英]Filtering Nulls from multiple columns

使用SQL Server 2005。

數據位於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語句如下所示:

Where (DateTime1 is not null or DateTime2 is not 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

以下將允許包含行,如果

  • 只有DateTime1有一個值
  • 只有DateTime2具有值
  • 都有價值

它將排除兩個值均為NULL的行。 那是你追求的嗎? (我嘗試跟進對話,但迷路了,希望您對樣本數據進行簡單的復制-我認為CTE和所有其他聯接和邏輯確實可以解決您遇到的實際問題。)

WHERE COALESCE([MC].[DateTime1], [RM].[DateTime2]) IS NOT NULL

但是,由於您正在執行LEFT OUTER JOIN ,因此它可能屬於[RM]ON子句,而不是WHERE 否則,您將不知道是否排除了某行,因為匹配的行中的值為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

因此,正如我在評論中建議的那樣,如果您沒有看到期望的行,則需要查看查詢的其他部分。 如果您提供示例數據和所需結果,我們可以嘗試幫助您縮小范圍。 實際上,我認為我們對您的架構和數據了解不足,無法確定問題出在哪里。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM