PostgreSQL:查找和删除空列

9gm1akwq  于 12个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(151)

有一堆表,有40个奇数列,有些表有大约6000万行
在一个表中,有许多列的每一行都是空的,我需要识别这些列,并将它们与非空列(其中至少有一行有数据)分开。
目前还不完全清楚删除空列是否会释放磁盘空间,但通过识别空列和非空列将允许更容易的数据过滤,例如SELECT id,b,c,d FROM t或构建视图等。
在这个例子中,我需要找到列a / A

create table t (id int, a int, b int, c int, d int);
insert into t (id, a, b, c, d) values
(1, null, 7, 7, 7),
(2, null, 7, 7, null),
(3, null, 7, 7, 7);

 select DISTINCT
   case when a is null then 'A ' else '' end ||
   case when b is null then 'B ' else '' end ||
   case when c is null then 'C ' else '' end ||
   case when d is null then 'D ' else '' end as null_columns
 from t

字符串
返回

null_columns
A
A D


这里有一个dbfiddle
我只需要A

fkaflof6

fkaflof61#

删除包含NULL的列不会释放任何存储空间。删除列永远不会释放PostgreSQL中的存储空间。但无论如何您无法保存任何存储空间,因为NULL列在PostgreSQL中不占用任何空间。
你可以通过计数找到所有NULL的列:

SELECT CASE WHEN count(a) = 0 THEN 'a has only NULLs' END,
       CASE WHEN count(b) = 0 THEN 'b has only NULLs' END,
       ...
FROM t;

字符串

相关问题