У меня есть эти данные в моей базе данных Postgres, сохраненные как TEXT, мне нужно получить подробную информацию о значении, когда ID = 4417907656850, и обновить его в отдельном столбце.
Как я могу получить к нему доступ и получить столбец значений, когда идентификатор упоминается, как указано выше?
[
{"id": 23581047, "value": null}
, {"id": 23776117, "value": false}
, {"id": 23772413, "value": false}
, {"id": 4441053996050, "value": null}
, {"id": 4417907677458, "value": "cr_shipments"}
, {"id": 360020702020, "value": null}
, {"id": 360011112800, "value": true}
, {"id": 4417907656850, "value": "shipments__external__carrier__return_to_sender"}
, {"id": 360011108000, "value": ["return"]}
, {"id": 360011112620, "value": false}
, {"id": 360011112640, "value": false}
]
Вы можете получить доступ к данным из JSON, используя json_to_recordset:
select *
from json_to_recordset('[
{"id": 23581047, "value": null}
, {"id": 23776117, "value": false}
, {"id": 23772413, "value": false}
, {"id": 4441053996050, "value": null}
, {"id": 4417907677458, "value": "cr_shipments"}
, {"id": 360020702020, "value": null}
, {"id": 360011112800, "value": true}
, {"id": 4417907656850, "value": "shipments__external__carrier__return_to_sender"}
, {"id": 360011108000, "value": ["return"]}
, {"id": 360011112620, "value": false}
, {"id": 360011112640, "value": false}
]'::json)
as x(id bigint, value json)
CREATE TABLE foo (
id serial NOT NULL PRIMARY KEY,
bar json NOT NULL
);
INSERT INTO foo (bar)
VALUES('[
{"id": 23581047, "value": null}
, {"id": 23776117, "value": false}
, {"id": 23772413, "value": false}
, {"id": 4441053996050, "value": null}
, {"id": 4417907677458, "value": "cr_shipments"}
, {"id": 360020702020, "value": null}
, {"id": 360011112800, "value": true}
, {"id": 4417907656850, "value": "shipments__external__carrier__return_to_sender"}
, {"id": 360011108000, "value": ["return"]}
, {"id": 360011112620, "value": false}
, {"id": 360011112640, "value": false}
]
');
WITH cte AS (
SELECT json_array_elements(bar) AS json FROM foo
)
SELECT
*
FROM
cte
WHERE
CAST (json ->> 'id' AS BIGINT) = 4417907656850;
рабочий пример: https://dbfiddle.uk/?rdbms=postgres_11&fiddle=8d71aa125ea696e8cf5d2df177c1be13
Примечание. Я считаю, что вы можете использовать lateral вместо обычного табличного выражения, если хотите, чтобы разложить массив.
Вы можете использовать выражение пути JSON:
select jsonb_path_query_first(the_column::jsonb, '$[*] ? (@.id == 4417907656850)') ->> 'value'
from the_table;