select
count(col_1),
count(col_2),
count(col_3)
from
<table>
vuelve el número de registros por columna tienen un valor no nulo (al menos en Oracle, que es.)
Por ejemplo
drop table tq84_count_nulls;
create table tq84_count_nulls (
col_1 varchar(50),
col_2 number,
col_3 date
);
insert into tq84_count_nulls values (null, null, null);
insert into tq84_count_nulls values ('xx', null, null);
insert into tq84_count_nulls values (null, 42, null);
insert into tq84_count_nulls values ('yy', 12, null);
select
count(col_1),
count(col_2),
count(col_3)
from
tq84_count_nulls;
rendimientos
COUNT(COL_1) COUNT(COL_2) COUNT(COL_3)
------------ ------------ ------------
2 2 0
lo que indica que col_3 solo consta de nulos.
Esta idea se puede usar para crear la vista deseada.
La mesa ahora necesita también la group_id * *:
drop table tq84_count_nulls;
create table tq84_count_nulls (
col_1 varchar(50),
col_2 number,
col_3 date,
group_id varchar(2)
);
insert into tq84_count_nulls values (null, null, null, 'a');
insert into tq84_count_nulls values ('xx', null, null, 'a');
insert into tq84_count_nulls values (null, 42, null, 'a');
insert into tq84_count_nulls values ('yy', 12, null, 'a');
insert into tq84_count_nulls values (null, null, null, 'b');
insert into tq84_count_nulls values (null, null, null, 'b');
insert into tq84_count_nulls values (null, 42, null, 'b');
insert into tq84_count_nulls values (null, 12, null, 'b');
create or replace view nulls_per_type as
with n as (
select
count(col_1) col_1_count,
count(col_2) col_2_count,
count(col_3) col_3_count,
group_id
from
tq84_count_nulls
group by
group_id
),
o as (
select case col_1_count when 0 then 'COL_1 is always 0 for ' || group_id else null end u from n union all
select case col_2_count when 0 then 'COL_2 is always 0 for ' || group_id else null end u from n union all
select case col_3_count when 0 then 'COL_3 is always 0 for ' || group_id else null end u from n
)
select * from o where u is not null;
cual estando seleccionado retorna:
select * from nulls_per_type;
COL_1 is always 0 for b
COL_3 is always 0 for a
COL_3 is always 0 for b
Así que si usted tiene 50 columnas y 10 de ellos contienen sólo valores NULL, que desea una consulta que sólo se regreso las 40 columnas que tienen datos en realidad? ¿Y presumiblemente si uno de los otros 10 adquiere un valor, su consulta devolvería 41 columnas? – MartW
Parece que tiene diferentes "tipos" o "tipos" de registros en la misma tabla, donde le gustaría tener una vista separada para cada uno. ¿Hay una columna que identifica el "tipo" del registro? –
Sí, es correcto @CodeByMoonlight. –