Postgres добавить дополнительное поле к json индексу полезной нагрузки в массиве перед вставкой набора записей в базу данных - PullRequest
0 голосов
/ 14 июля 2020

Я создаю хранимую процедуру в postgres, которая принимает json и вставляет в таблицу, выполняя команду json_to_recordset. Перед вставкой набора записей в таблицу SQL с помощью этой команды я хочу добавить дополнительное поле в качестве индекса к json в массиве json. Возможно ли это?

Для каждого индекса в массиве я хочу добавить «current_status»: «pending»

[
    {
        "batch_id": "40",
        "state_id": "10"
    },
    {
        "batch_id": "40",
        "state_id": "10"
    }
]

после

[
    {
        "batch_id": "40",
        "state_id": "10",
        "current_status": "pending"
    },
    {
        "batch_id": "40",
        "state_id": "10"
        "current_status": "pending"
    }
]

Другой вариант - обновление только НОВЫЕ записи в таблице постфактум. Я новичок в postgres и читал документацию.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

На основании вашего добавленного комментария, current_status = 'pending' следует добавить как часть вставки в вашу целевую таблицу вместо добавления ключа к объектам json.

insert into target_table (batch_id, state_id, current_status)
select batch_id, state_id, 'pending' as current_status
  from json_to_recordset(<json>) as x(batch_id text, state_id text); 
0 голосов
/ 14 июля 2020

Добавление к правильному ответу Майка, в случае, если мы хотим изменить существующие таблицы с помощью json массивов, чтобы включить статус, мы можем:

-- First create the table
CREATE TABLE myJson AS

SELECT '[
  {
    "batch_id": "40",
    "state_id": "10"
  },
  {
    "batch_id": "50",
    "state_id": "60"
  }
]'::json js;

WITH unnest_and_concat AS (
  SELECT json_array_elements(js)::jsonb || json_build_object('current_status', 'pending')::jsonb jee
  FROM myJson)
SELECT json_agg(jee)::json
FROM unnest_and_concat;

Конечно, это предназначено только для работы с таблицей этими рядами (для иллюстрации). Если цель состоит в том, чтобы обновить всю таблицу, мы можем сделать это (в идеале с помощью LATERAL JOIN), смешанного с оператором обновления. Выглядит так:

UPDATE myJson
SET old_col=new_col
FROM <insert subquery or table>
WHERE myJson.id = new_table.id;

Тем не менее, я бы рекомендовал вносить изменения при вставке, а не обновлять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...