2013-09-27 88 views
2

考虑下表(快照):条件选择语句

enter image description here

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

  • 至少4为例,其中7列值(VAL,EQ,EFF,...,SY)不为NULL ..

任何想法该怎么做?

+0

这不是太困难,但是,你有没有尝试过自己的东西? –

+0

那么,我试图调制一些逻辑,但我不知道如何将它们翻译成查询语言:也许检查is.na()为每个单元格,总结行,并检查总和是否大于但我不确定如何将其作为查询编写。 – Mayou

回答

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服务器2005。 IIF是sql server 2012,但您可以替代CASE WHEN VAL IS NULL THEN 1 ELSE 0 END

+0

+1我现在知道'IIF'和'CASE'方法正是我如何做到的。 :) – Khan

1

由于值是数字或NULL你可以使用这个ISNUMERIC()

SELECT * 
FROM YourTable 
WHERE ISNUMERIC(VAL)+ISNUMERIC(EQ)+ISNUMERIC(EFF)+ISNUMERIC(SIZE) 
    +ISNUMERIC(FSCR)+ISNUMERIC(MSCR)+ISNUMERIC(SY) >= 4 
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 

我喜欢这个解决方案,因为它是分裂的数据,从数据处理 - 你得到这个派生出来的“表值”后,你可以做anithing到它,并且很容易在将来改变逻辑。你可以总结,计算,做任何你想要的聚合。如果它是像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