Я ищу запрос, который вернет мне дополнительный столбец в конце моего текущего запроса, который представляет собой количество всех столбцов в возвращаемом наборе, которые содержат нулевой столбец. Например:
Col 1 - Col 2 - Col 3
A B 0
A NULL 1
NULL NULL 2
Есть ли простой способ получить этот набор возвращаемых значений на основе значений строк вместо того, чтобы повторно запрашивать все критерии, которые выбирают исходные строки?


Если нет веской причины, по которой вам нужно сделать это в SQL, вы должны просто выполнить цикл for по набору результатов и затем подсчитать значения NULL.
Стоимость меняется от n ^ n до n ..
@AJ, это не логика базы данных, это логика модели. Я бы сохранил это в модели. Но я понимаю, что кто-то с такой забавной реализацией, возможно, не использует MVC, так что это может быть спорным вопросом. Да и как можно сказать, что этот SQL понятен: P
Уродливое решение:
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! Пожалуйста, попробуйте добавить пояснение к коду, так как оно будет полезно для использования в будущем.
@Alexander, стоимость времени выполнения с точки зрения циклов процессора может снизиться, но затраты разработчика / сопровождающего с точки зрения понимания кода возрастут. Если это логика базы данных, я предлагаю сохранить ее в БД.