удаление пустых строк, где столбцы динамически выбираются - PullRequest
0 голосов
/ 09 октября 2018

У меня есть таблица с большим количеством столбцов значений, которая выглядит следующим образом:

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

Таблица может содержать динамическое количество столбцов значений (например, a, b, c).

Мне нужно удалить строки, где все значения равны нулю, но отметка времени не равна нулю.

Я не могу создать запрос на выборку, который будет возвращать только нулевые строки.

Делать что-то вроде:

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 голосов
/ 09 октября 2018

Вы можете преобразовать строку в объект 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...