考虑下表(快照):
我想编写一个查询来从表中选择
的行知道怎么做吗?
答案 0 :(得分: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
。
答案 1 :(得分: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.在此解决方案中,您只需将count
更改为sum
,添加where
子句即可。如果是iif(Val is null, 0, 1) +
,首先您必须考虑应该对此做些什么,然后将每个项目更改为,例如case when Val > 2 then Val else 0 end
。
<强> sql fiddle demo 强>
答案 2 :(得分:1)
由于值为数字或NULL
,因此可以使用ISNUMERIC()
:
SELECT *
FROM YourTable
WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE)
+ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4