如何合并两个 JSON 数组中的记录?

2023-12-15

我有两个返回 JSON 数组的 Postgres SQL 查询:

q1:

[
  {"id": 1, "a": "text1a", "b": "text1b"},
  {"id": 2, "a": "text2a", "b": "text2b"},
  {"id": 2, "a": "text3a", "b": "text3b"},
  ...
 ]

q2:

[
  {"id": 1, "percent": 12.50}, 
  {"id": 2, "percent": 75.00}, 
  {"id": 3, "percent": 12.50}
  ...
]

我希望结果是两个数组唯一元素的并集:

[
  {"id": 1, "a": "text1a", "b": "text1b", "percent": 12.50},
  {"id": 2, "a": "text2a", "b": "text2b", "percent": 75.00},
  {"id": 3, "a": "text3a", "b": "text3b", "percent": 12.50},
  ...
]

在 Postgres 9.4 中如何使用 SQL 来完成此操作?


Assuming数据类型jsonb并且您想要合并共享相同“id”值的每个 JSON 数组的记录。

Postgres9.5

新的让事情变得更简单连接运算符|| for jsonb values:

SELECT json_agg(elem1 || elem2) AS result
FROM  (
   SELECT elem1->>'id' AS id, elem1
   FROM  (
      SELECT '[
        {"id":1, "percent":12.50}, 
        {"id":2, "percent":75.00}, 
        {"id":3, "percent":12.50}
       ]'::jsonb AS js
      ) t, jsonb_array_elements(t.js) elem1
   ) t1
FULL JOIN (
   SELECT elem2->>'id' AS id, elem2
   FROM  (
      SELECT '[
        {"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
        {"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
        {"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
      ) t, jsonb_array_elements(t.js) elem2
   ) t2 USING (id);

The FULL [OUTER] JOIN确保您不会丢失其他数组中没有匹配的记录。

方式jsonb具有方便的属性,仅保留记录中每个键的最新值。因此,结果中重复的“id”键会自动合并。

Postgres 9.5 手册还建议:

注:||运算符连接顶层的元素 它的每个操作数。它不递归操作。例如,如果 两个操作数都是具有公共键字段名称的对象,其值 结果中的字段将只是右侧操作数的值。

Postgres 9.4

就是有点不太方便。我的想法是提取数组元素,然后提取所有键/值对,UNION两个结果聚合成一个新的jsonb每个 id 值的值并最终聚合到一个数组中。

SELECT json_agg(j) -- ::jsonb
FROM  (
   SELECT json_object_agg(key, value)::jsonb AS j
   FROM  (
      SELECT elem->>'id' AS id, x.*
      FROM  (
         SELECT '[
           {"id":1, "percent":12.50}, 
           {"id":2, "percent":75.00}, 
           {"id":3, "percent":12.50}]'::jsonb AS js
         ) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
      UNION ALL  -- or UNION, see below
      SELECT elem->>'id' AS id, x.*
      FROM  (
         SELECT '[
           {"id": 1, "a": "text1a", "b": "text1b", "percent":12.50},
           {"id": 2, "a": "text2a", "b": "text2b", "percent":75.00},
           {"id": 3, "a": "text3a", "b": "text3b", "percent":12.50}]'::jsonb AS js
         ) t, jsonb_array_elements(t.js) elem, jsonb_each(elem) x
      ) t
   GROUP  BY id
   ) t;

演员阵容jsonb删除重复的键。或者你可以使用UNION折叠重复项(例如,如果您想要json结果)。测试哪个对于您的情况更快。

Related:

  • 如何将json数组转为postgres数组?
  • 在查询中合并串联 JSON(B) 列
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何合并两个 JSON 数组中的记录? 的相关文章

随机推荐

  • 为什么第二个 if 子句还要执行?

    我有一个do while在我的程序中循环 谁的继续条件不断给我一个相差一的错误 我不明白为什么 它看起来像这样 do while ii le nri and ed ii le e1 do some stuff ii ii 1 end do
  • jQuery.getScript() 无法加载函数

    我正在尝试加载具有如下函数的脚本 getScript js mymy js done function if readCookie my cookie yes do sth here or getScript js mymy js func
  • 将单元格的 NA 值替换为同一数据框中另一列的值

    我有一个在我看来很简单的问题 但我自己无法解决 我在StackOverflow上搜索了解决方案 我猜已经有人解决了 但我还没有找到 我有一个基于 5 个数据框合并的数据框 如下所示 id mag1 mag2 mag3 1 name name
  • php - 如何验证正则表达式本身?

    我需要验证用户输入 该输入可能是用于过滤他 她自己的应用程序中的字段的正则表达式 如何检查该正则表达式的有效性 将其传递给一个虚拟调用preg match 看看它是否返回 false 指示错误 Note 根据您打算运行此应用程序的位置 我会
  • SwiftUI Picker onChange 或同等产品?

    我想换另一个不相关的 State变量 当Picker改变了 但是没有onChanged并且不可能放一个didSet在挑选器上 State 还有其他方法可以解决这个问题吗 iOS 14 或更高版本的部署目标 苹果提供了一个内置的onChang
  • WordPress 自定义查询字符串和漂亮的 URL - 如何实现?

    我有一个非常好的 到目前为止 新网站的 WordPress 设置 漂亮的网址按预期工作 我有 1 个动态页面 根据查询字符串加载内容 dynamic loc england code uk 我也希望使这个 URL 变得 漂亮 但每次我修改
  • Stream.forEach 是否尊重顺序流的遇到顺序?

    Javadoc 的Stream forEach说 强调我的 此操作的行为显然是不确定的 对于并行流管道 此操作不保证遵守流的遇到顺序 因为这样做会牺牲并行性的好处 对于任何给定的元素 可以在库选择的任何时间和任何线程中执行该操作 如果操作访
  • Spring Batch:如何将 jobParameters 传递给自定义 bean?

    我仍在研究 spring Batch 并遇到了一个场景 我需要将 jobParameter 传递给自定义 bean job参数包含文件的路径 我的上下文如下所示
  • 如何获取属于magento中属性组的所有属性

    我有一个属性组 我想获取属于特定属性组的属性列表 有没有办法获取一个属性组下的所有属性 适用于法师 1 7 0 0 function printGroupAttributes groupId attributesCollection Mag
  • 在ggplot2中用直方图叠加箱线图

    您好 我想使用 R 脚本创建一个类似的图表 如下所示 取自 https community tableau com thread 194440 这是我在 R 中的代码 library ggplot2 ifile lt read table
  • a += b 和 a =+ b 以及 a++ 和 ++a 有什么区别?

    正如我在标题中提到的 a b 和 a b 以及 a 和 a 之间有什么区别 我有点困惑 a b相当于a a b a b相当于a b a and a两者都递增a1 不同之处在于a 返回值a在增量之前 而 a返回增量后的值 That is a
  • Android Studio (0.3.2) 和 ZXing

    我无法让 ZXing 在 Android Studio 中工作 我已经使用 Ant 生成了 core jar 文件 并且相同的 jar 使用 Eclipse 运行良好 现在我必须让它在 Android Studio 0 3 2 中工作 这是
  • asp.net 中的列表框未获取所选项目

    我的网页中有多个下拉菜单和列表框 我正在尝试获取以下列表CategoryID from a lstCatID列表框我可以用类别名称填充列表框 如果我在第一次尝试中没记错的话 我的代码工作得很好 之后我做了一些更改 然后它表示始终选择第一个项
  • http/1.0 和 deflate/gzip

    http 1 0 能够处理压缩和 gzip 内容吗 我已经完成了在我的极简 Web 服务器中实现 deflate 和 gzip 但我真的不知道使用 http 1 0 的浏览器是否能够处理 deflate 和 gzip 压缩内容 好吧 这实际
  • 为什么日食氧气无法启动(第一次)? [复制]

    这个问题在这里已经有答案了 我喜欢使用eclipseoxy进行java开发 我已经有大约一年没有使用这个 IDE 了 我记得我真的很喜欢它 然而 我记得它并不是最容易安装的 IDE 任何帮助将不胜感激 这是我安装的java Java 9 J
  • 使用 Python requests 库或其他方式查找重定向的 URL [重复]

    这个问题在这里已经有答案了 这个网址 重定向至 http www callmyname sg view Multiple Choices Uk9JRC9TRzA0SkstQkJDNkRFNTEuMTNCNS9FRDY5LUE4NzgtRUY
  • 如何将向量传递给基于推力的 odeint 观察者的构造函数,以便可以在函子内读取它

    我正在从与推力一起使用的 boost odeint 扩展参数研究示例 并且我不知道如何将值向量传递给观察者的构造函数 以便可以从观察者函子内访问 只读 这些值 以下是仅供观察者使用的代码 Observes the system compar
  • 无法在 PostgreSQL 上的函数内部声明变量

    我正在 PostgreSQL 中编写函数 但它不允许我在其中声明变量 这是函数 CREATE FUNCTION clean emp RETURNS void AS func DECLARE cnt varchar func LANGUAGE
  • 如何使用 Jackson 在 Java 中高效地读取 JSON 文件中的数据?

    我将所有静态数据存储在JSON文件 这JSON文件最多有1000行 如何获取所需的数据而不将所有行存储为ArrayList 我的代码 我现在正在使用 我想提高它的效率 List
  • 如何合并两个 JSON 数组中的记录?

    我有两个返回 JSON 数组的 Postgres SQL 查询 q1 id 1 a text1a b text1b id 2 a text2a b text2b id 2 a text3a b text3b q2 id 1 percent