我正在尝试创建一个查询,该查询将返回除 1 列之外的所有具有空值的所有行。有些行在某处会有多个空条目。我将要排除一列,因为此时所有条目均为空,并且它是唯一允许具有空值的列。我被卡住了,因为我不知道如何在 WHERE 中包含所有列。
SELECT *
FROM Analytics
WHERE * IS NULL
或者,我可以对一列进行计数,但该表大约有 67 列。
SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL
我正在尝试创建一个查询,该查询将返回除 1 列之外的所有具有空值的所有行。有些行在某处会有多个空条目。我将要排除一列,因为此时所有条目均为空,并且它是唯一允许具有空值的列。我被卡住了,因为我不知道如何在 WHERE 中包含所有列。
SELECT *
FROM Analytics
WHERE * IS NULL
或者,我可以对一列进行计数,但该表大约有 67 列。
SELECT COUNT(*)
FROM Analytics
WHERE P_Id IS NULL
在 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
可能构建具有 67 列的查询会更有效,但它节省了一些输入或需要动态 SQL 来生成它。
根据您使用的 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('')
希望这有助于您入门。
祝你好运。
我没有这样的表来测试,假设'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 + ')')
对于像我这样的 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;
这是针对 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