У меня есть таблица, как следующая
CREATE TABLE test (
name varchar(128)
);
INSERT INTO test
VALUES
('tblname_01'),
('tblname_02'),
('tblname_03');
SELECT * FROM test;
Я хотел бы получить следующий результат:
{
"rule-type": "selection",
"rule-id": "1001",
"rule-name": "1001",
"object-locator": {
"schema-name": "%",
"table-name": "tblname_01"
},
"rule-action": "include",
"filters": []
},
{
"rule-type": "selection",
"rule-id": "1002",
"rule-name": "1002",
"object-locator": {
"schema-name": "%",
"table-name": "tblname_02"
},
"rule-action": "include",
"filters": []
},
{
"rule-type": "selection",
"rule-id": "1003",
"rule-name": "1003",
"object-locator": {
"schema-name": "%",
"table-name": "tblname_03"
},
"rule-action": "include",
"filters": []
}
На самом деле мне нужно создать JSON-файл из более чем 100 названий таблиц. Но сначала попробовал создать JSON-файлы из трех названий таблиц, но у меня этого не получилось.
Откуда берутся все эти данные в JSON, их нет в вашей таблице? Пожалуйста, приведите минимально воспроизводимый пример.
Вам нужно сделать это исключительно в Postgres? В противном случае простая программа запросит таблицу, переберет имена таблиц и вставит имена в шаблон.
На основе ваших данных вы можете сделать что-то вроде этого
select
jsonb_agg(
jsonb_build_object(
'rule-type', 'selection',
'rule-id', split_part(name,'_',2)::int+1000,
'rule-name', split_part(name,'_',2)::int+1000,
'object-locator',
jsonb_build_object(
'schema-name', '%',
'table-name', name
),
'rule-action', 'include',
'filters', array[]::text[]
)
)
from test;
Для построения числовой последовательности rule
вы можете использовать generate_series
и снова присоединить к ней исходную таблицу:
select jsonb_agg(jsonb_build_object('rule-type', 'selection',
'rule-id', (1000+n)::text,
'rule-name', (1000+n)::text,
'object-locator', jsonb_build_object('schema-name', '%', 'table-name', t1.name),
'rule-action', 'include',
'filters', jsonb_build_array()
))
from generate_series(1, (select count(*) from test)) n
join (select row_number() over (order by t.name) r, t.* from test t) t1
on t1.r = n
Спасибо за это. Единственное, в вашем коде объекты сортируются по алфавиту. Как этого избежать и оставить свой такой порядок.
@Kvv Порядок появления пар ключ-значение в объекте JSON тривиален, и по этой причине его невозможно установить. Здесь важны уровни дерева JSON.
Вы уверены в этой структуре? Похоже, это должен быть массив. Проверьте различные функции создания объектов: postgresql.org/docs/current/…