2

考虑下表(快照):

在此处输入图像描述

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

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

知道怎么做吗?

4

3 回答 3

5

这里没什么特别的,只需计算每行非空的数量:

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.

于 2013-09-27T19:38:09.523 回答
2

这个怎么样?将您的列变成“行”并使用 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 的非空元素求和。在此解决方案中,您只需更改countsum, addwhere子句即可。如果是iif(Val is null, 0, 1) +,首先您必须考虑应该对此做什么,然后将每个项目更改为,例如,case when Val > 2 then Val else 0 end

sql fiddle demo

于 2013-09-27T19:59:28.220 回答
1

由于这些值要么是数字,要么NULL您可以ISNUMERIC()用于此:

SELECT *
FROM YourTable
WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE)
     +ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4
于 2013-09-27T19:45:00.467 回答