Sql 如何获取返回集中每行空值列的计数?

Sql 如何获取返回集中每行空值列的计数?,sql,Sql,我正在寻找一个查询,它将在当前查询的末尾返回一个额外的列,该列是返回集中包含空列的所有列的计数。例如: Col 1 - Col 2 - Col 3 A B 0 A NULL 1 NULL NULL 2 有没有一种简单的方法可以基于行值获取此返回集,而不必重新查询获取原始行的所有条件?如果在SQL中没有很好的理由需要这样做,那么只需在结果集中执行for循环,然后计算空值 成本从n^n增加到n..丑陋的解决方案: select Col1, Co

我正在寻找一个查询,它将在当前查询的末尾返回一个额外的列,该列是返回集中包含空列的所有列的计数。例如:

Col 1 - Col 2 - Col 3
A       B       0
A       NULL    1
NULL    NULL    2

有没有一种简单的方法可以基于行值获取此返回集,而不必重新查询获取原始行的所有条件?

如果在SQL中没有很好的理由需要这样做,那么只需在结果集中执行for循环,然后计算空值

成本从n^n增加到n..

丑陋的解决方案:

select Col1, Col2,
       case when Col1 is null then 1 else 0 end
     + case when Col2 is null then 1 else 0 end
     as Col3
from (

select 'A' as Col1, 'B' as Col2
union select 'A', NULL
union select NULL, NULL

) z
这是回报

Col1 Col2 Col3
NULL NULL 2
A    NULL 1
A    B    0

您可以使用计算列:

CREATE TABLE testTable(
    col1 nchar(10) NULL,
    col2 nchar(10) NULL,
    col3  AS (case when col1 IS NULL then (1) else (0) end+case when col2 IS NULL then (1) else (0) end)
)
这不是一个很好的解决方案,但应该可行

如果您要处理大量的列,并且其中许多列预期为空,那么您可以使用(在SQLServer2008中提供)。它将针对NULL进行优化,并且可以为表中的每一行数据自动生成XML表示

select count(*) - count(ColumnName) as NumberOfNulls from yourTable
返回特定列中的Null数。如果对每一列执行此操作,则可以获得该数据。

Oracle有一个函数NVL2(),使此操作变得简单

select col1,
       col2,
       col3,
       ...
        NVL2(col1,0,1)
       +NVL2(col2,0,1)
       +NVL2(col3,0,1) coln
from   whatever

正如在一篇类似的文章中一样,SQL不太适合跨行中的不同列工作,但更适合跨行工作

我建议把表格变成关于一行的“个人”事实,例如

select <key>, col1 as value From aTable
UNION
select <key>, col2 as value From aTable
UNION
... and so on for the other columns to be summed.
那么正确的答案就是

select key, count(*)
from aView
where value is null
Group By key

@Alexander,运行时的cpu周期成本可能会下降,但开发人员/维护人员理解代码的成本会上升。如果是数据库逻辑,我建议将其保存在数据库中。@AJ,它不是数据库逻辑,而是模型逻辑。我会把它放在模型里。但我意识到,有这样一个时髦的实现的人可能不使用MVC,所以这可能是一个没有实际意义的观点。哦,你怎么能说SQL是可以理解的:PWelcome to StackOverflow!请尝试为代码添加解释,因为这将有助于将来的参考。
select key, count(*)
from aView
where value is null
Group By key
create table TEST
(
  a VARCHAR2(10),
  b VARCHAR2(10),
  c VARCHAR2(10)
);

insert into TEST (a, b, c)
values ('jas', 'abhi', 'shail');
insert into TEST (a, b, c)
values (null, 'abhi', 'shail');
insert into TEST (a, b, c)
values ('jas', null, 'shail');
insert into TEST (a, b, c)
values ('jas', 'abhi', null);
insert into TEST (a, b, c)
values ('jas', 'abhi', 'abc|xyz');
insert into TEST (a, b, c)
values ('jas', 'abhi', 'abc|xyz');
insert into TEST (a, b, c)
values ('jas', 'abhi', 'abc|xyz');
insert into TEST (a, b, c)
values (null, 'abhi', 'abc|xyz');
commit;

select sum(nvl2(a,null,1)),sum(nvl2(b,null,1)),sum(nvl2(c,null,1))  from test 
where a is null 
or b is null
or c is null
order by 1,2,3