2017-05-05 63 views
3

我有一個看起來很直接的問題,但由於某些原因,我無法擺脫我從選擇打擊空值。我需要做的就是返回一行,即沒有NULL值的行。有人能以我的方式指出錯誤嗎? :)刪除這些darn NULLS

運行的時候,我得到的結果是:

EffectiveDate   Refund 
2015-05-18 00:00:00.000 NULL 
2015-05-18 00:00:00.000 1 

我希望回:

EffectiveDate   Refund 
2015-05-18 00:00:00.000 1 

我的查詢:

select md.EffectiveDate, 
     CASE 
     WHEN 
      ISNULL(ConfigID,'') = 3 THEN '1' 
     WHEN 
      ISNULL(ConfigID,'') = 4 THEN '2' 
     END AS Refund 
from dbo.PartnerBankConfig md 
where md.PartnerID= 100000509 
and md.EffectiveDate = (select max(EffectiveDate) 
         from dbo.PartnerBankConfig 
         where PartnerID = 100000509 
         and ISNULL(ConfigID,'') IS NOT NULL) 
+3

那麼,如果你使用ISNULL的空值轉換爲空字符串,則IS NOT NULL永遠評估爲True ... –

+2

@JacobH:它永遠不會評估爲False –

+0

用'和ConfigID IS NOT NULL'替換'和ISNULL(ConfigID,''IS NOT NULL)''。 –

回答

3

你因爲數據與您的case語句中的任何條件都不匹配,因此請獲取此空值。換句話說,在該行中,對於既不是3也不是4的ConfigID,它具有值。當沒有任何條件匹配時,case語句的行爲是求值爲null,並因此爲該行返回null。

此外,此功能:ISNULL(ConfigID,'')用空字符串(非空值)替換任何空值。

因此,ISNULL(ConfigID,'') IS NOT NULL沒有意義。它總是會是真的,因爲ISNULL總是返回一個非空值。您應該從查詢中刪除ISNULL()的每一次使用,因爲它們都不是必需的。

3

正如丹解釋,您使用ISNULL()是不恰當的。從你的描述,你似乎想這個簡單的查詢:

select md.EffectiveDate, 
     (CASE WHEN ConfigID = 3 THEN 1 
      WHEN ConfigID = 4 THEN 2 
     END) as Refund 
from (select md.*, max(EffectiveDate) over (partition by PartnerId) as maxed 
     from dbo.PartnerBankConfig md 
     where md.PartnerID = 100000509 and 
      configId in (3, 4) 
    ) md 
where md.EffectiveDate = maxed; 

或者更簡單地說:

select top (1) with ties md.EffectiveDate, 
     (CASE WHEN ConfigID = 3 THEN 1 
      WHEN ConfigID = 4 THEN 2 
     END) as Refund 
from (select md.*, max(EffectiveDate) over (partition by PartnerId) as maxed 
     from dbo.PartnerBankConfig md 
where md.PartnerID = 100000509 and 
     ConfigId in (3, 4) 
order by EffectiveDate desc; 
+0

感謝大家的反饋,這讓我朝着正確的方向前進,我想,再次感謝! – PeteMiller