在PostgreSQL中查找非空列

60

我需要为每个表格分配一个任务,计算可空列。很简单:

 SELECT table_name, count(*) FROM INFORMATION_SCHEMA.COLUMNS
 WHERE is_nullable='NO'
 GROUP BY table_name;
现在我需要修改代码来计算“具有“NOT NULL”属性的列”的数量。以下代码是否可以实现此功能,还是仅检查列名是否不为空?
CREATE TEMP TABLE A AS 
SELECT DISTINCT column_name, table_name AS name FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name IS NOT NULL
GROUP BY table_name, column_name;

SELECT name, count(*) FROM A
GROUP BY name;

如果没有任何特定的需求,那么可以考虑使用Python自带的sqlite3模块进行数据库操作。

如果需要更复杂的功能,可以尝试使用第三方库,例如SQLAlchemy或Peewee。这些库提供了更高级的ORM(对象关系映射)功能,使得数据库操作更加容易和直观。

有什么建议吗?


我认为问题在于列是否被显式地设置为NOT NULL,或者它是否是主键(主键永远不会为空)。如果是这样的话,看起来COLUMNS没有这个信息。可能需要在pg_attrdef中搜索列定义以获取NOT NULL信息。否则,它只是重申了你的第一个查询。 - nate c
看起来 COLUMNS 有这些信息。声明一个列为 NOT NULL PRIMARY KEY 或仅为 PRIMARY KEY 将 is_nullable 设置为 'NO'。显式声明为 NULL 和隐式声明为 NULL 的列将 is_nullable 设置为 'YES'。 - Mike Sherrill 'Cat Recall'
3个回答

74

不。

此查询

SELECT DISTINCT column_name, table_name
FROM INFORMATION_SCHEMA.COLUMNS
WHERE column_name IS NOT NULL

将返回具有“column_name”列中的值的所有行。

该表中的所有行始终都会在“column_name”列中具有值。

您只需要知道有多少列可为空,以及有多少列不可为空吗?

SELECT is_nullable, COUNT(*)
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY is_nullable;

按表名计数?我认为你可以使用这个。

SELECT table_name, is_nullable, count(*)
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY table_name, is_nullable
ORDER BY table_name, is_nullable;

13
对于那些正在寻找列中所有具有“NOT NULL”约束的谷歌用户:SELECT table_name, column_name FROM information_schema.columns WHERE table_schema = 'public' AND is_nullable = 'NO';。根据需要更改table_schema ='public' - Daniel Waltrip

3
获取所有非空列的计数:

要获取所有非空列的计数:

SELECT count(*)
  FROM information_schema.columns
  WHERE  table_name  = 'table_name'
     AND is_nullable = 'NO';

1
请将以下与编程有关的内容从英文翻译成中文。返回仅翻译的文本:请在您的答案中添加一些注释。 - denis

2

要获取任何表中所有非空列的计数,请使用:

Original Answer翻译成"最初的回答"

SELECT count(*)
  FROM information_schema.columns
 WHERE table_schema = 'table_schema_here'
   AND table_name   = 'table_name_here'
   AND is_nullable = 'YES';

我希望这能帮助到某些人。

最初的回答:


is_nullable = 'YES'? - user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接