POSTGRESQL скопировать значение jsonb в новый столбец - PullRequest
0 голосов
/ 10 апреля 2020

Я хочу извлечь значение json из столбца и вставить его в новый.

Пример строки скопированного оператора вставки:

INSERT INTO "table_name".("booking_number","arrival_date","departure_date","custom_fields","customer_id","import_id","id","at_table","a_la_carte","value")
VALUES
(E'00000007',E'2019-01-02 12:00:00',E'2020-02-05 12:00:00',E'[{"protelSurname": "Smith", "servicio_tags": ["protel-info"], "protelUniqueID": "[{\\"ID\\":\\"294623726\\",\\"Type\\":\\"21\\",\\"ID_Context\\":\\"GHA\\"},{\\"ID\\":\\"4842148\\",\\"Type\\":\\"1\\",\\"ID_Context\\":\\"protelIO\\"}]", "protelGivenName": "Seth"}, {"value": "3/3/3/3/3", "display_name": "Personen Anzahl", "servicio_tags": ["person-number-info"]}, {"value": "en", "display_name": "Sprache", "servicio_tags": ["language"]}, {"value": " Robotics", "display_name": "Begleiter", "servicio_tags": ["accompanied-guests"]}, {"value": "2. Januar 2019", "display_name": "Anreise", "servicio_tags": ["arrival"]}, {"value": "5. Februar 2020", "display_name": "Abreise", "servicio_tags": ["departure"]}, {"value": "EBROV RO", "display_name": "Rate Code", "servicio_tags": ["price-type"]}, {"value": "SSV", "display_name": "Zimmer Typ", "servicio_tags": ["room-type"]}, {"value": "2013", "display_name": "Zimmernummer", "servicio_tags": ["room-number"]}, {"value": "Australia", "display_name": "Nation", "servicio_tags": ["nation"]}, {"value": "", "display_name": "Gruppe", "servicio_tags": ["group-name"]}]',1,36020,369528,FALSE,FALSE,E'{"protelSurname": "Smith", "servicio_tags": ["protel-info"], "protelUniqueID": "[{\\"ID\\":\\"294623726\\",\\"Type\\":\\"21\\",\\"ID_Context\\":\\"GHA\\"},{\\"ID\\":\\"4842148\\",\\"Type\\":\\"1\\",\\"ID_Context\\":\\"protelIO\\"}]", "protelGivenName": "Seth"}');

Я хочу извлечь protelUniqueID с меткой servicio ["protel-info"]. В лучшем случае только значение ID. В этом случае 294623726. Затем я хочу создать новый столбец с именем guest_profile_id в этой таблице с именем guest_group и вставить это значение для той же строки.

Так что я думаю, что это необходимо сделать с помощью следующих шагов:

  1. Создание нового столбца
  2. Идентификатор запроса из json столбец
  3. Вставка идентификатора в новый столбец

Моя попытка пока для шага 2)

SELECT *
 FROM guest_group gg
cross join lateral jsonb_array_elements(custom_fields) 
WHERE value @> '{"servicio_tags": ["protel-info"]}'::jsonb
AND gg.customer_id = 1

Спасибо за помощь.

1 Ответ

1 голос
/ 13 апреля 2020

Прежде всего protelUniqueID - это список. Вам нужен только первый ID из списка, как я понял.

Примечание! "protelUniqueID": "[{\\"ID\\": .... выглядит как странный формат. Это как json как string внутри json. В любом случае я поделюсь решением для вашего описания.

CREATE TABLE my_tbl (custom_fields jsonb);
INSERT INTO my_tbl (custom_fields)
VALUES
(
E'{"protelSurname": "Smith", "servicio_tags": ["protel-info"], "protelUniqueID": "[{\\"ID\\":\\"294623726\\",\\"Type\\":\\"21\\",\\"ID_Context\\":\\"GHA\\"},{\\"ID\\":\\"4842148\\",\\"Type\\":\\"1\\",\\"ID_Context\\":\\"protelIO\\"}]", "protelGivenName": "Seth"}'
);

Давайте попробуем выбрать наши ID (294623726):

SELECT
    custom_fields::json->'servicio_tags' AS tags,
    CAST(CAST(CAST(custom_fields::json->'protelUniqueID' AS jsonb)->>0 AS jsonb)->>0 AS jsonb)->>'ID' AS protel_first_id
FROM my_tbl;
-- tags,protel_first_id
--["protel-info"],294623726

Все, что нам нужно, это просто добавить столбец + update

ALTER TABLE my_tbl ADD COLUMN guest_profile_id INTEGER DEFAULT NULL;
UPDATE my_tbl set guest_profile_id = CAST(CAST(CAST(CAST(custom_fields::json->'protelUniqueID' AS jsonb)->>0 AS jsonb)->>0 AS jsonb)->>'ID' AS INTEGER) WHERE guest_profile_id IS NULL;

пример db-fiddle

Примечание! Вы можете удалить 1 CAST, если будете использовать команду clear Формат:

INSERT INTO my_tbl (custom_fields)
VALUES
(
E'{"protelUniqueID": [{"ID":"294623726","Type":"21","ID_Context":"GHA"},{"ID":"4842148","Type":"1","ID_Context":"protelIO"}]}'
);

SELECT
    CAST(CAST(custom_fields::json->'protelUniqueID' AS jsonb)->>0 AS jsonb)->>'ID' AS protel_first_id
FROM my_tbl;

Надеюсь, это поможет.

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