我有一个包含大量值列的表,它看起来像:

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/

10-15 18:13