我有一个包含大量值列的表,它看起来像:
CREATE TABLE tbl ("timestamp" timestamp PRIMARY KEY, "a" real, "b" real, "c" real)
该表可以包含动态数量的值列(如a、b、c)。
我需要删除所有值都为空的行,但timestamp不为空。
我无法生成只返回空行的select查询。
做一些类似的事情:
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
但它不起作用。
最佳答案
可以将行转换为JSONB对象,删除“timestamp”列,然后检查是否有空值:
select *
from tbl
where jsonb_strip_nulls(to_jsonb(tbl) - 'timestamp') = '{}'::jsonb;
这可以直接用于删除行:
delete from tbl
where jsonb_strip_nulls(to_jsonb(tbl) - 'timestamp') = '{}'::jsonb);
关于sql - 删除空行,其中动态选择了列,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/52717285/