在任意列中查找具有空值的所有行

时间:2013-01-23 20:34:23

标签: sql sql-server sql-server-2005 null correlated-subquery

我正在尝试创建一个查询,该查询将返回除1列之外的所有具有空值的行。某些行在某处会有多个空条目。我想要排除一列,因为此时所有条目都为空,并且它是唯一允许具有空值的列。我被困了,因为我不知道如何在WHERE中包含所有列。

SELECT *
FROM Analytics
WHERE * IS NULL

或者,我可以对一列进行计数,但该表有大约67列。

SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL

4 个答案:

答案 0 :(得分:11)

在SQL Server中,您可以从this answer

借用这个想法
;WITH XMLNAMESPACES('http://www.w3.org/2001/XMLSchema-instance' as ns)
SELECT *
FROM   Analytics
WHERE  (SELECT Analytics.*
        FOR xml path('row'), elements xsinil, type
        ).value('count(//*[local-name() != "colToIgnore"]/@ns:nil)', 'int') > 0

SQL Fiddle

可能使用67列构建查询会更有效,但它会节省一些输入或需要动态SQL来生成它。

答案 1 :(得分:1)

我没有这样的表来测试,假设在任何字段中都没有'x'作为数据,我认为这应该适用于Sql-Server; (DEMO

注意:我已将keyColumn过滤为c.name != 'keyColumn'

DECLARE @S NVARCHAR(max), @Columns VARCHAR(50), @Table VARCHAR(50)

SELECT @Columns = '66', --Number of cols without keyColumn
       @Table = 'myTable'

SELECT @S =  ISNULL(@S+'+ ','') + 'isnull(convert(nvarchar, ' + c.name + '),''x'')'  
FROM sys.all_columns c 
WHERE c.object_id = OBJECT_ID(@Table) AND c.name != 'keyColumn'

exec('select * from '+@Table+' where ' + @S + '= replicate(''x'',' + @Columns + ')')

答案 2 :(得分:0)

根据您使用的RDBMS,我认为您唯一的选择(而不是明确地说WHERE col1 IS NULL and col2 IS NULL and col3 IS NULL ...)将使用动态SQL。

例如,如果要从SQL Server数据库中获取所有列名,可以使用类似的方法返回这些名称:

SELECT
     name
FROM
     sys.columns
WHERE
     object_id = OBJECT_ID('DB.Schema.Table')

您可以使用FOR XML来创建WHERE子句:

SELECT Name + ' IS NULL AND ' AS [text()]
FROM sys.columns c1
WHERE     object_id = OBJECT_ID('DB.Schema.Table')
ORDER BY Name
FOR XML PATH('')

希望这有助于您入门。

祝你好运。

答案 3 :(得分:0)

对于像我这样的 SQL 初学者用户来说,上面的所有查询似乎都很难消化。我认为最快的方法就是为所有 67 列编写查询。它基本上只是一个复制和粘贴过程。 例如:

select count(*) from user where id is null or 
 name is null or 
 review_count is null or
 yelping_since is null or 
 useful is null or 
 funny is null;