【问题标题】:Removing these darn NULLS删除这些该死的 NULLS
【发布时间】:2017-10-04 00:34:22
【问题描述】:

我有一个看起来很简单的问题,但由于某种原因,我无法从打击选择中删除我的空值。我需要做的就是返回一行,即没有 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)

【问题讨论】:

  • 好吧,如果您使用 ISNULL 将 Null 转换为空白字符串,那么 IS NOT NULL 将永远不会评估为 True...
  • @JacobH:它永远不会评估为 False
  • and ISNULL(ConfigID,'') IS NOT NULL) 替换为and ConfigID IS NOT NULL
  • 对...所以它应该只是并且 ConfigID 不是 NULL
  • 我标记了这个 sql-server,因为 dboisnull() 强烈建议这样做。

标签: sql sql-server syntax


【解决方案1】:

您得到此 null 是因为数据与您的 case 语句中的任何条件都不匹配。 换句话说,在该行中,您的 ConfigID 值既不是 3 也不是 4。行为当没有任何条件匹配时,case 语句的计算结果为 null,因此该行将返回 null。

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

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

【讨论】:

    【解决方案2】:

    正如 Dan 解释的那样,您使用 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;
    

    【讨论】:

    • 感谢大家的反馈,这让我朝着正确的方向前进,我认为,再次感谢!
    猜你喜欢
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 2019-07-14
    • 1970-01-01
    • 2015-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多