从JsonB数组中删除数字项

托马斯·马里克(Tomas Marik)

我具有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数组中删除项目?

欧文·布兰德斯特

两个断言:

  1. 许多Postgres JSON函数和运算符将键/值对作为键的目标JSON数组中的字符串"abc""33")被视为没有值的键。但是数字(33123.45)数组元素被视为

  2. 当前有该-运算符的三种变体其中两个适用于此。如最近澄清的手册所述(当前为/ devel):

    运算符
          说明
          示例
    :---------------------
    jsonb - textjsonb
          从JSON对象中删除键(及其值),或从中删除匹配的字符串值JSON数组。
          '{"a": "b", "c": "d"}'::jsonb - 'a'{"c": "d"}
          '["a", "b", "c", "b"]'::jsonb - 'b'["a", "c"]
    ...
    jsonb - integerjsonb
          删除与指定的索引的数组元素(负整数从末端计数)。
          如果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
  • JSON数组(与Postgres数组不同)可以包含多种元素类型。因此,某些数组元素可能是numeric,但其他元素string等等。
  • 强制转换所有数组元素(在左侧)更昂贵。只需将值转换为要替换的值(在右侧)。

因此,这适用于任何类型,而不仅仅是整数(JSON数值)。例:

'{"values": ["abc", "22", 33]}') 

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

从数组中删除数字

来自分类Dev

从数组中删除数字

来自分类Dev

从数组中删除数字

来自分类Dev

从数组中删除数字

来自分类Dev

从数组中删除数字?

来自分类Dev

JavaScript:删除数组中的重复项

来自分类Dev

删除数组列表中的重复项

来自分类Dev

删除数组中的重复项

来自分类Dev

如何删除数组中的重复项?

来自分类Dev

从PHP中的数组中删除数字

来自分类Dev

从数组中永久删除数字

来自分类Dev

从javascript数组中删除数字范围

来自分类Dev

从numpy数组中删除数字偶数

来自分类Dev

删除数字数组中的重复数字

来自分类Dev

删除数组重复项

来自分类Dev

通过数组中的数字C删除数组

来自分类Dev

在PHP中删除数组中的重复项

来自分类Dev

从数字中删除数字

来自分类Dev

根据匹配的ID删除数组中的重复项。滑轨

来自分类Dev

如何删除数组Ruby中的重复项

来自分类Dev

根据列值删除数组中的重复项

来自分类Dev

计算和删除数组c中的重复项

来自分类Dev

根据匹配的ID删除数组中的重复项。滑轨

来自分类Dev

删除数组 Javascript / AngularJS 中的重复项

来自分类Dev

PHP - 删除数组中的所有重复项

来自分类Dev

使用纯 Javascript 或 Typescript 删除数组中的重复项

来自分类Dev

前端只删除数组中的最后一项

来自分类Dev

使用 forEach 删除数组中的重复项

来自分类Dev

删除数组 reactjs 中对象特定值的重复项