SQL Query检查表中的40列是否为空

时间:2009-04-23 04:37:35

标签: sql

如何在表中选择仅包含所有行的NULL值的几列? 假设如果Table有100列,则在这100列中,60列具有空值。 我如何写出条件来检查60列是否为空。

9 个答案:

答案 0 :(得分:21)

也许是COALESCE

SELECT * FROM table WHERE coalesce(col1, col2, col3, ..., colN) IS NULL

答案 1 :(得分:7)

where c1 is null and c2 is null ... and c60 is null

使用 string concatenation (Oracle语法)的快捷方式:

where c1||c2||c3 ... c59||c60 is null

答案 2 :(得分:1)

您是否试图找出一组特定的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行,因为多个列为空。

答案 3 :(得分:1)

首先,如果您的表具有如此多的空值并使用SQL Server 2008,则可能需要使用稀疏列(http://msdn.microsoft.com/en-us/library/cc280604.aspx)来定义表。

其次我不确定coalesce是否解决了问题 - 似乎Ammu可能真的想找到所有行为空的列列表,但我可能会误解。然而 - 这是一个有趣的问题,所以我编写了一个过程来列出任何给定表的空列:

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

答案 4 :(得分:0)

了解您正在使用哪个数据库以及使用哪个语言或数据库框架将会有所帮助。

这应该适用于任何数据库。

这样的东西可能是一个很好的存储过程,因为它没有输入参数。

select count(*) from table where col1 is null or col2 is null ...

答案 5 :(得分:0)

这是另一种在我看来也是合乎逻辑的方法(使用Netezza或TSQL)

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

因此,TEST_COLUMN值为0的每个MAX都是包含记录集的所有空值的列。函数NVL2表示如果列数据不为null则返回1,但如果为null则返回0。

获取该列的MAX将显示是否有任何行不为空。值为1表示至少有一行包含数据。零(0)表示每行都为空。

答案 6 :(得分:0)

如果您不想写列名称,请尝试执行此类操作 除了您指定的列(IgnoreThisColumn1& IgnoreThisColumn2)之外,当所有列值都为null时,这将显示所有行。

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]

答案 7 :(得分:0)

您可以使用

select NUM_NULLS  , COLUMN_NAME  from all_tab_cols  where table_name = 'ABC' and COLUMN_NAME in ('PQR','XYZ');

答案 8 :(得分:0)

当我必须检查多个列为NULL时,我使用以下查询。我希望这是有帮助的 。如果SUM的值不是零,则该列中为NULL

select SUM (CASE WHEN col1 is null then 1 else 0 end) as null_col1,
SUM (CASE WHEN col2 is null then 1 else 0 end) as null_col2,
SUM (CASE WHEN col3 is null then 1 else 0 end) as null_col3, ....
.
.
.
from tablename