Как мне получить количество столбцов с нулевым значением в строке в возвращаемом наборе?

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

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

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

ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
0
8 311
7

Ответы 7

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

Стоимость меняется от n ^ n до n ..

@Alexander, стоимость времени выполнения с точки зрения циклов процессора может снизиться, но затраты разработчика / сопровождающего с точки зрения понимания кода возрастут. Если это логика базы данных, я предлагаю сохранить ее в БД.

AJ. 06.10.2008 21:13

@AJ, это не логика базы данных, это логика модели. Я бы сохранил это в модели. Но я понимаю, что кто-то с такой забавной реализацией, возможно, не использует MVC, так что это может быть спорным вопросом. Да и как можно сказать, что этот SQL понятен: P

Alexander Morland 07.10.2008 12:43

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

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)
)

Это не очень хорошее решение, но должно работать.

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

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

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

В 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.

Это можно превратить в представление, т.е.

create view aView as (select as above).

Тогда правильный ответ просто

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 

Добро пожаловать в StackOverflow! Пожалуйста, попробуйте добавить пояснение к коду, так как оно будет полезно для использования в будущем.

Unni Kris 11.11.2012 09:01

Другие вопросы по теме