我有一个看似直截了当的问题,但出于某种原因,我无法从击打选择中删除我的空值。我需要做的就是返回一行,那一行没有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)
答案 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;