删除空行,其中动态选择了列

时间:2018-10-09 09:08:27

标签: sql postgresql

我有一个表,其中包含大量的值列,如下所示:

CREATE TABLE tbl ("timestamp" timestamp PRIMARY KEY, "a" real, "b" real, "c" real)

该表可能包含动态数量的值列(如a,b,c)。

我需要删除所有值均为null但时间戳记不为null的行。

我无法建立仅返回空行的选择查询。

做类似的事情:

select * 
from tbl 
where tbl is null

不起作用,因为时间戳不为空

我尝试举以下工作示例:

select * 
from tbl 
where not (a,b,c) is null

并向其添加子选择:

select * 
from tbl 
where not (
    SELECT string_agg(column_name, ',')
    FROM information_schema.columns
    WHERE table_name   = 'tbl' and column_name != 'timestamp'
) is null

但是它不起作用。

1 个答案:

答案 0 :(得分:3)

您可以将行转换为JSONB对象,删除“时间戳”列,然后检查一个空值:

select *
from tbl 
where jsonb_strip_nulls(to_jsonb(tbl) - 'timestamp') = '{}'::jsonb;

这可以直接用于删除行:

delete from tbl
where jsonb_strip_nulls(to_jsonb(tbl) - 'timestamp') = '{}'::jsonb);