Как получить количество столбцов с нулевым значением для каждой строки в возвращаемом наборе? - PullRequest
2 голосов
/ 06 октября 2008

Я ищу запрос, который вернет мне дополнительный столбец в конце моего текущего запроса, который является количеством всех столбцов в возвращаемом наборе, которые содержат нулевой столбец. Например:

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

Есть ли простой способ получить этот возвращаемый набор на основе значений строк вместо необходимости запрашивать все критерии, которые выбирают исходные строки?

Ответы [ 7 ]

3 голосов
/ 06 октября 2008

Oracle имеет функцию NVL2 (), которая делает это легко.

select col1,
       col2,
       col3,
       ...
        NVL2(col1,0,1)
       +NVL2(col2,0,1)
       +NVL2(col3,0,1) coln
from   whatever
3 голосов
/ 06 октября 2008

Уродливое решение:

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
2 голосов
/ 06 октября 2008
select count(*) - count(ColumnName) as NumberOfNulls from yourTable

возвращает количество нулей в определенном столбце. если вы сделаете это для каждого столбца, вы можете получить эти данные.

1 голос
/ 24 сентября 2011
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 
1 голос
/ 07 октября 2008

Как и в аналогичном посте, 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
0 голосов
/ 06 октября 2008

Вы можете использовать вычисляемый столбец:

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, вы можете использовать разреженных столбцов (доступно в SQL Server 2008). Он будет оптимизирован для NULL и может автоматически генерировать представление XML для каждой строки данных в таблице.

0 голосов
/ 06 октября 2008

Если нет веской причины, по которой вам нужно сделать это в SQL, вы должны просто выполнить цикл for для набора результатов и подсчитать значения NULL.

Стоимость переходит от n ^ n к n ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...