2017-05-05 43 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