条件选择语句

时间:2013-09-27 19:25:11

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

考虑下表(快照):

enter image description here

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

的行
  • 7个列值(VAL,EQ,EFF,...,SY)中至少有4个不是NULL ..

知道怎么做吗?

3 个答案:

答案 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