我有一个表,其中包含大量的值列,如下所示:
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
但是它不起作用。
答案 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);