删除这些darn NULLS

时间:2017-05-05 13:36:20

标签: sql sql-server syntax

我有一个看似直截了当的问题,但出于某种原因,我无法从击打选择中删除我的空值。我需要做的就是返回一行,那一行没有NULL值。有人可以用我的方式指出错误吗? :)

运行时得到的结果:

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)

2 个答案:

答案 0 :(得分:3)

你得到这个null,因为数据与case语句中的任何条件都不匹配。换句话说,在该行中,ConfigID的值既不是3也不是4。行为当没有条件匹配时,case语句的值是为了求值为null,因此为该行返回null。

此外,此函数:ISNULL(ConfigID,'')用空字符串(非空值)替换任何null。

因此,ISNULL(ConfigID,'') IS NOT NULL没有意义。它总是如此,因为ISNULL总是返回一个非空值。您应该从查询中删除ISNULL()的每次使用,因为这些都不是必需的。

答案 1 :(得分: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;