【问题标题】:Conditional select statement条件选择语句
【发布时间】:2013-10-04 05:07:12
【问题描述】:

考虑下表(快照):

我想写一个查询来从表中选择行

  • 7 个列值(VAL、EQ、EFF、...、SY)中至少有 4 个不为 NULL..

知道怎么做吗?

【问题讨论】:

  • 难度不大,但是,你自己尝试过吗?
  • 好吧,我试图编造一些逻辑,但我不知道如何将它们翻译成查询语言:也许检查每个单元格的 is.na(),对行求和,然后检查总和是否大于 4。但我不确定如何将其写为查询。

标签: sql sql-server sql-server-2005 select


【解决方案1】:

这个怎么样?将您的列变成“行”并使用 SQL 来计算非空值:

select *
from Table1 as t
where
    (
        select count(*) from (values
           (t.VAL), (t.EQ), (t.EFF), (t.SIZE), (t.FSCR), (t.MSCR), (t.SY)
        ) as a(val) where a.val is not null
    ) >= 4

我喜欢这个解决方案,因为它将数据从数据处理中分离出来——在你得到这个派生的“带值的表”之后,你可以对它做任何事情,而且将来很容易改变逻辑。你可以求和、计数、做任何你想要的聚合。如果是 case when t.VAL then ... end + ..., 之类的,则必须多次更改逻辑。

例如,假设您想对所有大于 2 的非空元素求和。在此解决方案中,您只需将 count 更改为 sum,添加 where 子句即可。如果是iif(Val is null, 0, 1) +,首先您必须考虑应该对此做什么,然后将每个项目更改为,例如case when Val > 2 then Val else 0 end

sql fiddle demo

【讨论】:

    【解决方案2】:

    由于值是数字或NULL,因此您可以使用ISNUMERIC()

    SELECT *
    FROM YourTable
    WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE)
         +ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4
    

    【讨论】:

      【解决方案3】:

      这里没什么花哨的,只计算每行非空的数量:

      SELECT *
      FROM Table1
      WHERE
        IIF(VAL IS NULL, 0, 1) +
        IIF(EQ IS NULL, 0, 1) + 
        IIF(EFF IS NULL, 0, 1) + 
        IIF(SIZE IS NULL, 0, 1) + 
        IIF(FSCR IS NULL, 0, 1) +
        IIF(MSCR IS NULL, 0, 1) + 
        IIF(SY IS NULL, 0, 1) >= 4
      

      刚刚注意到您标记了 sql-server-2005。 IIF 是 sql server 2012,但可以替换为 CASE WHEN VAL IS NULL THEN 1 ELSE 0 END

      【讨论】:

      • +1 因为我现在知道IIFCASE 方法正是我会做的。 :)
      猜你喜欢
      • 2014-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多