Sql 删除这些该死的空值
我有一个问题,这似乎是直截了当的,但由于某种原因,我无法从blow select中删除空值。我需要做的就是返回一行,那一行没有空值。有人能用我的方式指出错误吗?:) 我跑步时得到的结果:Sql 删除这些该死的空值,sql,sql-server,syntax,Sql,Sql Server,Syntax,我有一个问题,这似乎是直截了当的,但由于某种原因,我无法从blow select中删除空值。我需要做的就是返回一行,那一行没有空值。有人能用我的方式指出错误吗?:) 我跑步时得到的结果: 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 我期待的
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
我期待的回报:
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)
由于数据与case语句中的任何条件都不匹配,因此会得到此空值。换句话说,在该行中,ConfigID的值既不是3也不是4。当所有条件都不匹配时,case语句的行为是计算为null,因此此行返回null 此外,此函数:
ISNULL(ConfigID')
将任何null替换为空字符串(非null值)
因此,
ISNULL(ConfigID,”)不是NULL
没有意义。它总是会为true,因为ISNULL总是返回一个非null值。您应该从查询中删除ISNULL()
,因为它们都不是必需的。正如丹解释的那样,您使用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;
如果您使用ISNULL将空值转换为空字符串,那么IS NOT NULL将永远不会计算为True…@JacobH:它将永远不会计算为false替换
,并且ISNULL(ConfigID,'')不为NULL)
为,ConfigID不为NULL
。对。。。所以它应该是,ConfigID不是null我标记了这个sql server,因为dbo
和isnull()
强烈建议这样做。感谢大家的反馈,这让我走上了正确的方向,我想,再次感谢!