我具有jsonb
嵌套JSON数组的值,需要删除一个元素:
{"values": ["11", "22", "33"]}
jsonb_set(column_name, '{values}', ((column_name -> 'values') - '33')) -- WORKS!
我也有一个类似的数字,而不是字符串jsonb
值:
{"values": [11, 22, 33]}
jsonb_set(column_name, '{values}', ((column_name -> 'values') - 33)) -- FAILS!
在这种情况下33
,用作数组的索引。
当项目是数字时,如何从JSON数组中删除项目?
两个断言:
许多Postgres JSON函数和运算符将键/值对作为键的目标。JSON数组中的字符串("abc"
或"33"
)被视为没有值的键。但是数字(33
或123.45
)数组元素被视为值。
当前有该-
运算符的三种变体。其中两个适用于此。如最近澄清的手册所述(当前为/ devel):
运算符
说明
示例
:---------------------
jsonb
-
text
→jsonb
从JSON对象中删除键(及其值),或从中删除匹配的字符串值JSON数组。
'{"a": "b", "c": "d"}'::jsonb - 'a'
→{"c": "d"}
'["a", "b", "c", "b"]'::jsonb - 'b'
→["a", "c"]
...
jsonb
-
integer
→jsonb
删除与指定的索引的数组元素(负整数从末端计数)。
如果JSON值不是数组,则会引发错误。
'["a", "b"]'::jsonb - 1
→["a"]
正确的操作数是数字文字,Postgres运算符类型的解析将到达后面的变体。
不幸的是,由于断言1,我们不能使用前一种变体开始。
因此,我们必须使用类似的解决方法:
SELECT jsonb_set(column_name
, '{values}'
, (SELECT jsonb_agg(val)
FROM jsonb_array_elements(t.column_name -> 'values') x(val)
WHERE val <> jsonb '33')
) AS column_name
FROM tbl t;
db <>在这里摆弄-具有扩展的测试用例
不要将未嵌套的元素投射到integer
(如另一个答案所示)。
integer
。numeric
,但其他元素string
等等。因此,这适用于任何类型,而不仅仅是整数(JSON数值)。例:
'{"values": ["abc", "22", 33]}')
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句