我正在寻找一个查询,它会在我当前查询的末尾返回一个额外的列,该列是返回集中包含空列的所有列的计数。例如:
Col 1 - Col 2 - Col 3
A B 0
A NULL 1
NULL NULL 2
是否有一种简单的方法可以根据行值获取此返回集,而不必重新查询获取原始行的所有条件?
答案 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表示。