22

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

SELECT *
FROM Analytics
WHERE * IS NULL

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

SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL
4

5 回答 5

16

在 SQL Server 中,您可以从这个答案中借用这个想法

;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小提琴

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

于 2013-01-23T21:08:41.483 回答
1

根据您使用的 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('')

希望这有助于您入门。

祝你好运。

于 2013-01-23T20:49:02.367 回答
1

我没有这样的表来测试,假设'x'在任何字段中都没有 as 数据,我认为这应该可以Sql-Server;(演示

注意:我已将 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 + ')')
于 2013-01-23T20:55:06.327 回答
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;
于 2021-06-19T00:24:48.840 回答
0

这是针对 SQLite 的,略有不同,但我遇到了同样的问题,最后我编写了这个小 Python 脚本findnulls.py来查找数据库中的所有空值:

import sqlite3
import sys

def main():
    dbfile = sys.argv[1]
    conn = sqlite3.connect(dbfile)
    c = conn.cursor()

    tables = c.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall()

    for table in tables:
        tablename = table[0]
        cols = c.execute("PRAGMA table_info({0})".format(tablename)).fetchall()

        for col in cols:
            colname = col[1]
            nullvals = c.execute("SELECT COUNT(*) FROM {0} WHERE {1} IS NULL;".format(tablename, colname)).fetchall()
            if nullvals[0][0] != 0:
                print("found {0} nulls in table: {1} column {2}".format(nullvals[0][0], tablename, colname))

main()

你会像这样运行它:

findnulls.py somedatabase.db

输出如下所示:

found 1 nulls in table: Channels column MessageId
found 1 nulls in table: Channels column MessageChannel
found 1 nulls in table: Channels column SignalType    
found 7 nulls in table: Channels column MinVal        
found 7 nulls in table: Channels column MaxVal        
found 9 nulls in table: Channels column AvgVal        
found 9 nulls in table: Channels column Median
found 9 nulls in table: Channels column StdDev
于 2022-01-20T23:23:01.240 回答