搜索表格中的所有列

时间:2016-03-02 21:31:53

标签: sql postgresql search null

我有一个包含300多列的表,其中许多列都没有数据。是否有一个查询,我可以用来找出这些列的名称,以便我可以删除它们的表。另外,如果重要的话,我在redshift服务器上使用postgresql数据库

2 个答案:

答案 0 :(得分:0)

首先获得字段名称

SELECT *
FROM information_schema.columns
WHERE table_schema = 'your_schema'
  AND table_name   = 'your_schema'

然后使用循环创建一个动态查询

SELECT count(*)
FROM 'your_schema'.'your_schema'
WHERE `yourfield` IS NOT NULL
HAVING count(*) = 0

Using a cursor with dynamic SQL in a stored procedure

答案 1 :(得分:0)

您可以尝试使用jsonb typefunctions

让我们说你的表声明为

create table t as (x int, y varchar, z numeric);

首先让我们将表的行转换为jsonb。这很简单:

select to_jsonb(t.*) from t;

结果(对于测试数据)

         to_jsonb          
--------------------------
 {"x":1,"y":"a","z":null}
 {"x":2,"y":"b","z":null}

接下来,我们将使用另一个json函数将这些结果转换为(key,value)行:

select jsonb_each(to_jsonb(t.*)) from t;

结果:

  jsonb_each  
-------------
 (x,1)
 (y,"""a""")
 (z,null)
 (x,2)
 (y,"""b""")
 (z,null)

这几乎是我们所需要的。下一步:

select (w).key, (w).value from (select jsonb_each(to_jsonb(t.*)) as w from t) tt;

结果

 key | value 
-----+-------
 x   | 1
 y   | "a"
 z   | null
 x   | 2
 y   | "b"
 z   | null

在这里,我们使用(w)来指定它是字段而不是表。

最后一步:

select 
  (w).key 
from 
  (select jsonb_each(to_jsonb(t.*)) as w from t) tt 
group by 
  (w).key 
having 
  count(*) filter (where((w).value != 'null')) = 0;

结果

 key 
-----
 z

尝试使用最后一个查询,只需将t替换为您的表名。

UPD:

您也可以尝试使用PostgreSQL统计信息:

analyse yourtable;

select
  pg_class.relname,
  pg_attribute.attname,
  pg_statistic.stanullfrac
from
  pg_class join
    pg_statistic on (pg_class.oid = pg_statistic.starelid) join
      pg_attribute on (pg_class.oid = pg_attribute.attrelid and pg_statistic.staattnum = pg_attribute.attnum)
where
  pg_class.relname = 'yourtable';

stanullfrac列中,您将看到每个表的列的相对空值,其中1表示所有nuls(但我不确定它是如何准确的)