SQL-запрос, чтобы проверить, является ли 40 столбцов в таблице пустыми - PullRequest
8 голосов
/ 23 апреля 2009

Как выбрать несколько столбцов в таблице, которые содержат только значения NULL для всех строк? Предположим, что если таблица имеет 100 столбцов, среди этих 100 столбцов 60 столбцов имеют нулевые значения. Как я могу написать, где условие, чтобы проверить, если 60 столбцов являются нулевыми.

Ответы [ 8 ]

23 голосов
/ 23 апреля 2009

возможно с КОАЛЕЦ

SELECT * FROM table WHERE coalesce(col1, col2, col3, ..., colN) IS NULL
8 голосов
/ 23 апреля 2009
where c1 is null and c2 is null ... and c60 is null

ярлык с использованием string concatenation (синтаксис Oracle):

where c1||c2||c3 ... c59||c60 is null
1 голос
/ 23 апреля 2009

Прежде всего, если у вас есть таблица с таким большим количеством нулей, и вы используете SQL Server 2008 - вы можете определить таблицу, используя разреженные столбцы (http://msdn.microsoft.com/en-us/library/cc280604.aspx).

Во-вторых, я не уверен, решит ли coalesce вопрос, который задает вопрос. Кажется, Амму может на самом деле захотеть найти список столбцов, которые являются нулевыми для всех строк, но я мог неправильно понять. Тем не менее - это интересный вопрос, поэтому я написал процедуру для перечисления пустых столбцов для любой таблицы:

IF (OBJECT_ID(N'PrintNullColumns') IS NOT NULL)
    DROP PROC dbo.PrintNullColumns;
go
CREATE PROC dbo.PrintNullColumns(@tablename sysname)
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @query nvarchar(max);
    DECLARE @column sysname;
    DECLARE columns_cursor CURSOR FOR
        SELECT c.name
        FROM sys.tables t JOIN sys.columns c ON t.object_id = c.object_id
        WHERE t.name = @tablename AND c.is_nullable = 1;
    OPEN columns_cursor;
    FETCH NEXT FROM columns_cursor INTO @column;
    WHILE (@@FETCH_STATUS = 0)
    BEGIN
        SET @query = N'
        DECLARE @c int
        SELECT @c = COUNT(*) FROM ' + @tablename + ' WHERE ' + @column + N' IS NOT NULL
        IF (@c = 0)
            PRINT (''' + @column + N''');'
        EXEC (@query);

        FETCH NEXT FROM columns_cursor INTO @column;
    END
    CLOSE columns_cursor;
    DEALLOCATE columns_cursor;
    SET NOCOUNT OFF;
    RETURN;
END;
go
1 голос
/ 23 апреля 2009

Вы пытаетесь выяснить, является ли определенный набор из 60 столбцов нулевым, или вы просто хотите выяснить, являются ли какие-либо 60 из 100 столбцов пустыми (не обязательно одинаковые 60 для каждой строки?)

Если это последнее, то один из способов сделать это в Oracle - использовать функцию nvl2, например:

select ... where (nvl2(col1,0,1)+nvl2(col2,0,1)+...+nvl2(col100,0,1) > 59)

Быстрый тест этой идеи:

select 'dummy' from dual where nvl2('somevalue',0,1) + nvl2(null,0,1) > 1

Возвращает 0 строк, в то время как:

select 'dummy' from dual where nvl2(null,0,1) + nvl2(null,0,1) > 1

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

0 голосов
/ 08 марта 2019

вы можете использовать

select NUM_NULLS  , COLUMN_NAME  from all_tab_cols  where table_name = 'ABC' and COLUMN_NAME in ('PQR','XYZ');
0 голосов
/ 18 апреля 2018

Если вы не хотите писать имена столбцов, попробуйте сделать что-то вроде этого.
Это покажет вам все строки, когда все значения столбцов будут нулевыми, кроме указанных вами столбцов (IgnoreThisColumn1 & IgnoreThisColumn2).

DECLARE @query NVARCHAR(MAX);

SELECT @query = ISNULL(@query+', ','') + [name] 
                FROM  sys.columns 
                WHERE object_id = OBJECT_ID('yourTableName') 
                AND  [name] != 'IgnoreThisColumn1' 
                AND  [name] !=  'IgnoreThisColumn2';

SET @query = N'SELECT * FROM TmpTable WHERE COALESCE('+ @query +') IS NULL';

EXECUTE(@query)

Результат

Result One

Если вам не нужны строки, когда все столбцы пусты, кроме указанных вами столбцов, вы можете просто использовать IS NOT NULL вместо IS NULL

SET @query = N'SELECT * FROM TmpTable WHERE COALESCE('+ @query +') IS NOT NULL';

Результат

[Result Two[2]

0 голосов
/ 25 августа 2016

Вот еще один метод, который мне тоже кажется логичным (используйте Netezza или TSQL)

SELECT KeyColumn, MAX(NVL2(TEST_COLUMN,1,0) AS TEST_COLUMN 
  FROM TABLE1
 GROUP BY KeyColumn

Таким образом, каждый TEST_COLUMN со значением MAX, равным 0, является столбцом, который содержит все нули для набора записей. Функция NVL2 сообщает, что если данные столбца не равны нулю, возвращают 1, но если они равны нулю, возвращают 0.

Взятие MAX этого столбца покажет, является ли какая-либо из строк ненулевой. Значение 1 означает, что есть хотя бы 1 строка, в которой есть данные. Ноль (0) означает, что каждая строка равна нулю.

0 голосов
/ 23 апреля 2009

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

Это должно работать в любой базе данных.

Что-то вроде этого, вероятно, будет хорошей хранимой процедурой, поскольку для нее нет входных параметров.

select count(*) from table where col1 is null or col2 is null ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...