我正在尝试创建一个查询,该查询将返回除1列之外的所有具有空值的行。某些行在某处会有多个空条目。我想要排除一列,因为此时所有条目都为空,并且它是唯一允许具有空值的列。我被困了,因为我不知道如何在WHERE中包含所有列。
SELECT *
FROM Analytics
WHERE * IS NULL
或者,我可以对一列进行计数,但该表有大约67列。
SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL
答案 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
可能使用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;