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

时间:2008-10-06 09:59:13

标签: sql

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

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

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

7 个答案:

答案 0 :(得分:3)

丑陋的解决方案:

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

答案 1 :(得分:3)

Oracle有一个功能NVL2(),这使得这很容易。

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

答案 2 :(得分:2)

select count(*) - count(ColumnName) as NumberOfNulls from yourTable

返回特定列中的空值数。如果你为每一列都这样做,你就可以获得这些数据。

答案 3 :(得分:1)

正如在类似的帖子中那样,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.

这可以变成一种观点,即

create view aView as (select as above).

然后正确答案就是

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

答案 4 :(得分:1)

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 

答案 5 :(得分:0)

如果没有一个很好的理由需要在SQL中执行此操作,则应该在结果集中执行for循环,然后计算NULL值。

费用从n ^ n到n ..

答案 6 :(得分: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)
)

这不是一个漂亮的解决方案,但应该有用。

如果您正在处理大量列,并且其中许多列您希望为NULL,那么您可以使用sparse columns(在SQL Server 2008中可用)。它将针对NULL进行优化,并且可以自动为表中的每一行数据生成XML表示。