Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 删除这些该死的空值_Sql_Sql Server_Syntax - Fatal编程技术网

Sql 删除这些该死的空值

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 我期待的

我有一个问题,这似乎是直截了当的,但由于某种原因,我无法从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
我的问题是:

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()
强烈建议这样做。感谢大家的反馈,这让我走上了正确的方向,我想,再次感谢!