Подтвердить что ты не робот

Подсчитайте нулевые столбцы в строке в SQL

Я задавался вопросом о возможности подсчета нулевых столбцов строки в SQL, у меня есть таблица Customer с нулевыми значениями, просто я хочу запрос, возвращающий int числа нулевых столбцов для определенной строки (определенный клиент).

4b9b3361

Ответ 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