Я задавался вопросом о возможности подсчета нулевых столбцов строки в SQL, у меня есть таблица Customer с нулевыми значениями, просто я хочу запрос, возвращающий int числа нулевых столбцов для определенной строки (определенный клиент).
Подсчитайте нулевые столбцы в строке в SQL
Ответ 1
Этот метод назначает 1 или 0 для нулевых столбцов и добавляет их все вместе. Надеюсь, у вас не слишком много столбцов с нулевым значением, чтобы добавить сюда...
SELECT
((CASE WHEN col1 IS NULL THEN 1 ELSE 0 END)
+ (CASE WHEN col2 IS NULL THEN 1 ELSE 0 END)
+ (CASE WHEN col3 IS NULL THEN 1 ELSE 0 END)
...
...
+ (CASE WHEN col10 IS NULL THEN 1 ELSE 0 END)) AS sum_of_nulls
FROM table
WHERE Customer=some_cust_id
Обратите внимание: вы также можете сделать это, возможно, немного синтаксически чисто с помощью IF()
, если ваша RDBMS поддерживает его.
SELECT
(IF(col1 IS NULL, 1, 0)
+ IF(col2 IS NULL, 1, 0)
+ IF(col3 IS NULL, 1, 0)
...
...
+ IF(col10 IS NULL, 1, 0)) AS sum_of_nulls
FROM table
WHERE Customer=some_cust_id
Я тестировал этот шаблон против таблицы и, похоже, работал правильно.
Ответ 2
Только для ORACLE -DBMS.
Вы можете использовать функцию NVL2:
NVL2( string1, value_if_not_null, value_if_null )
Вот выбор с аналогичным подходом, как предположил Майкл Берковский:
SELECT (NVL2(col1, 0, 1)
+ NVL2(col2, 0, 1)
+ NVL2(col3, 0, 1)
...
...
+ NVL2(col10, 0, 1)
) AS sum_of_nulls
FROM table
WHERE Customer=some_cust_id
Более общий подход заключался бы в написании PL/SQL-блока и использовании динамического SQL. Вы должны построить строку SELECT с помощью метода NVL2 сверху для каждого столбца в all_tab_columns конкретной таблицы.
Ответ 3
К сожалению, в стандартном запросе SQL вам нужно будет ввести каждый столбец, который вы хотите протестировать, чтобы проверить все программно, вы можете использовать T-SQL. Предупреждение, однако, убедитесь, что вы работаете с подлинными NULLS, вы можете иметь пустые хранимые значения, которые база данных не будет распознавать как истинный NULL (я знаю, это звучит странно).
Вы можете избежать этого, взяв пустые значения и NULLS в следующем утверждении:
CASE WHEN col1 & '' = '' THEN 1 ELSE 0 END
Или в некоторых базах данных, таких как Oracle (не уверены, есть ли какие-либо другие), вы должны использовать:
CASE WHEN col1 || '' = '' THEN 1 ELSE 0 END
Ответ 4
Вы не указываете РСУБД. Для SQL Server 2008...
SELECT CustomerId,
(SELECT COUNT(*) - COUNT(C)
FROM (VALUES(CAST(Col1 AS SQL_VARIANT)),
(Col2),
/*....*/
(Col9),
(Col10)) T(C)) AS NumberOfNulls
FROM Customer
Ответ 5
В зависимости от того, что вы хотите сделать, и если вы игнорируете mavens, и если вы используете SQL Server 2012, вы могли бы по-другому..
Общее количество столбцов-кандидатов ( "слотов" ) должно быть известно. 1. Выберите все известные столбцы "слотов" по столбцам (они известны). 2. Не удалось получить результат, чтобы получить таблица с одной строкой на исходную колонку. Это работает, потому что нулевые столбцы не univot, и вы знаете все имена столбцов. 3. Считать (*) результат, чтобы получить количество ненулевых значений; вычитайте из этого, чтобы получить ответ.
Нравится это, для 4 "мест" в автомобиле
select 'empty seats' = 4 - count(*)
from
(
select carId, seat1,seat2,seat3,seat4 from cars where carId = @carId
) carSpec
unpivot (FieldValue FOR seat in ([seat1],[seat2],[seat3],[seat4])) AS results
Это полезно, если вам может понадобиться сделать больше позже, чем просто подсчитать количество ненулевых столбцов, так как оно дает вам возможность манипулировать столбцами как набор.
Ответ 6
Это даст вам количество столбцов, которые не равны нулю. вы можете применить это соответствующим образом
SELECT ISNULL(COUNT(col1),'') + ISNULL(COUNT(col2),'') +ISNULL(COUNT(col3),'')
FROM TABLENAME
WHERE ID=1
Ответ 7
Ниже script вы можете подсчитать значение NULL
в строке, то есть, сколько столбцов не имеет значений.
{SELECT
*,
(SELECT COUNT(*)
FROM (VALUES (Tab.Col1)
,(Tab.Col2)
,(Tab.Col3)
,(Tab.Col4)) InnerTab(Col)
WHERE Col IS NULL) NullColumnCount
FROM (VALUES(1,2,3,4)
,(NULL,2,NULL,4)
,(1,NULL,NULL,NULL)) Tab(Col1,Col2,Col3,Col4) }
Просто, чтобы продемонстрировать, что я использую встроенную таблицу в моем примере.
Попробуйте применить или преобразовать все значения столбцов в общий тип, это поможет вам сравнить столбец разного типа.
Ответ 8
Я еще не тестировал его, но я попытаюсь сделать это, используя функцию PL\SQL
CREATE OR REPLACE TYPE ANYARRAY AS TABLE OF ANYDATA
;
CREATE OR REPLACE Function COUNT_NULL
( ARR IN ANYARRAY )
RETURN number
IS
cnumber number ;
BEGIN
for i in 1 .. ARR.count loop
if ARR(i).column_value is null then
cnumber := cnumber + 1;
end if;
end loop;
RETURN cnumber;
EXCEPTION
WHEN OTHERS THEN
raise_application_error
(-20001,'An error was encountered - '
||SQLCODE||' -ERROR- '||SQLERRM);
END
;
Затем используйте его в выбранном запросе типа
CREATE TABLE TEST (A NUMBER, B NUMBER, C NUMBER);
INSERT INTO TEST (NULL,NULL,NULL);
INSERT INTO TEST (1 ,NULL,NULL);
INSERT INTO TEST (1 ,2 ,NULL);
INSERT INTO TEST (1 ,2 ,3 );
SELECT ROWNUM,COUNT_NULL(A,B,C) AS NULL_COUNT FROM TEST;
Ожидаемый результат
ROWNUM | NULL_COUNT
-------+-----------
1 | 3
2 | 2
3 | 1
4 | 0
Ответ 9
Вот как я пробовал
CREATE TABLE #temptablelocal (id int NOT NULL, column1 varchar(10) NULL, column2 varchar(10) NULL, column3 varchar(10) NULL, column4 varchar(10) NULL, column5 varchar(10) NULL, column6 varchar(10) NULL);
INSERT INTO #temptablelocal
VALUES (1,
NULL,
'a',
NULL,
'b',
NULL,
'c')
SELECT *
FROM #temptablelocal
WHERE id =1
SELECT count(1) countnull
FROM
(SELECT a.ID,
b.column_title,
column_val = CASE b.column_title
WHEN 'column1' THEN a.column1
WHEN 'column2' THEN a.column2
WHEN 'column3' THEN a.column3
WHEN 'column4' THEN a.column4
WHEN 'column5' THEN a.column5
WHEN 'column6' THEN a.column6
END
FROM
( SELECT id,
column1,
column2,
column3,
column4,
column5,
column6
FROM #temptablelocal
WHERE id =1 ) a
CROSS JOIN
( SELECT 'column1'
UNION ALL SELECT 'column2'
UNION ALL SELECT 'column3'
UNION ALL SELECT 'column4'
UNION ALL SELECT 'column5'
UNION ALL SELECT 'column6' ) b (column_title) ) AS pop WHERE column_val IS NULL
DROP TABLE #temptablelocal
Ответ 10
Существует нет простого способа сделать так, как будто бы с подсчетом строк. В принципе, вам нужно перечислить все столбцы, которые могут быть пустыми в одном выражении.
Итак, для таблицы с возможными нулевыми столбцами a
, b,
c
вы можете сделать это:
SELECT key_column, COALESCE(a,0) + COALESCE(b,0) + COALESCE(c,0) null_col_count
FROM my_table