Постгреск. Создать вывод, например JSON

У меня есть таблица, как следующая

Имя имя_таблицы_01 имя_таблицы_02 имя_таблицы_03
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-файлы из трех названий таблиц, но у меня этого не получилось.

Вы уверены в этой структуре? Похоже, это должен быть массив. Проверьте различные функции создания объектов: postgresql.org/docs/current/…

Frank Heikens 16.07.2024 16:48

Откуда берутся все эти данные в JSON, их нет в вашей таблице? Пожалуйста, приведите минимально воспроизводимый пример.

Charlieface 16.07.2024 17:03

Вам нужно сделать это исключительно в Postgres? В противном случае простая программа запросит таблицу, переберет имена таблиц и вставит имена в шаблон.

Schwern 17.07.2024 02:48
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
3
57
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

На основе ваших данных вы можете сделать что-то вроде этого

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 17.07.2024 07:34

@Kvv Порядок появления пар ключ-значение в объекте JSON тривиален, и по этой причине его невозможно установить. Здесь важны уровни дерева JSON.

Pepe N O 17.07.2024 17:03

Другие вопросы по теме