【发布时间】:2016-12-24 02:04:49
【问题描述】:
目前我正在使用 PostgreSQL 9.5 并尝试更新 jsonb 字段数组中的值。但我无法获取所选值的索引
我的桌子是这样的:
CREATE TABLE samples (
id serial,
sample jsonb
);
我的 JSON 如下所示:
{"result": [
{"8410": "ABNDAT", "8411": "Abnahmedatum"},
{"8410": "ABNZIT", "8411": "Abnahmezeit"},
{"8410": "FERR_R", "8411": "Ferritin"}
]}
我的 SELECT 语句可以得到正确的值:
SELECT
id, value
FROM
samples s, jsonb_array_elements(s.sample#>'{result}') r
WHERE
s.id = 26 and r->>'8410' = 'FERR_R';
结果:
id | value
----------------------------------------------
26 | {"8410": "FERR_R", "8411": "Ferritin"}
好的,这就是我想要的。现在我想使用以下 UPDATE 语句执行更新以添加新元素“ratingtext”(如果还没有):
UPDATE
samples s
SET
sample = jsonb_set(sample,
'{result,2,ratingtext}',
'"Some individual text"'::jsonb,
true)
WHERE
s.id = 26;
执行UPDATE语句后,我的数据是这样的(也正确):
{"result": [
{"8410": "ABNDAT", "8411": "Abnahmedatum"},
{"8410": "ABNZIT", "8411": "Abnahmezeit"},
{"8410": "FERR_R", "8411": "Ferritin", "ratingtext": "Some individual text"}
]}
到目前为止一切顺利,但我手动搜索了 2 的索引值以获取 JSON 数组中的正确元素。如果要更改顺序,这将不起作用。
所以我的问题:
有没有办法获取选中的 JSON 数组元素的索引,并将 SELECT 语句和 UPDATE 语句合二为一?
就像:
UPDATE
samples s
SET
sample = jsonb_set(sample,
'{result,' || INDEX OF ELEMENT || ',ratingtext}',
'"Some individual text"'::jsonb,
true)
WHERE
s.id = 26;
samples.id 和 "8410" 的值在准备语句之前是已知的。
或者这暂时不可能?
【问题讨论】:
标签: arrays json postgresql sql-update jsonb