如何在表中选择仅包含所有行的NULL值的几列? 假设如果Table有100列,则在这100列中,60列具有空值。 我如何写出条件来检查60列是否为空。
答案 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)
结果
如果除了指定的列之外所有列都为空时不想要行,则只需使用IS NOT NULL
代替IS NULL
SET @query = N'SELECT * FROM TmpTable WHERE COALESCE('+ @query +') IS NOT NULL';
结果
[
答案 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