考虑下表(快照):
我想写一个查询来从表中选择行
- 7 个列值(VAL、EQ、EFF、...、SY)中至少有 4 个不为 NULL。
知道怎么做吗?
考虑下表(快照):
我想写一个查询来从表中选择行
知道怎么做吗?
这里没什么特别的,只需计算每行非空的数量:
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
.
这个怎么样?将您的列变成“行”并使用 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
, addwhere
子句即可。如果是iif(Val is null, 0, 1) +
,首先您必须考虑应该对此做什么,然后将每个项目更改为,例如,case when Val > 2 then Val else 0 end
。
由于这些值要么是数字,要么NULL
您可以ISNUMERIC()
用于此:
SELECT *
FROM YourTable
WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE)
+ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4