当前位置: 首页 > 面试题库 >

合并查询中的串联JSON(B)列

高宏峻
2023-03-14
问题内容

我正在使用Postgres 9.4寻找一种在查询中合并两个(或更多)jsonjsonb列的方法。以下表为例:

  id | json1        | json2
----------------------------------------
  1   | {'a':'b'}   | {'c':'d'}
  2   | {'a1':'b2'} | {'f':{'g' : 'h'}}

查询是否可能返回以下内容:

  id | json
----------------------------------------
  1   | {'a':'b', 'c':'d'}
  2   | {'a1':'b2', 'f':{'g' : 'h'}}

不幸的是,我无法按此处所述定义函数。使用“传统”查询是否有可能?


问题答案:

这是可用于在PostgreSQL中创建json对象的内置函数的完整列表。http://www.postgresql.org/docs/9.4/static/functions-
json.html

  • row_to_json并且json_object不允许您定义自己的密钥,因此不能在此处使用
  • json_build_object 希望您提前知道我们的对象将具有多少个键和值,在您的示例中就是这种情况,但在现实世界中并非如此
  • json_object 看起来是解决此问题的好工具,但它迫使我们将价值观转化为文字,因此我们也无法使用

好吧…好吧,我们不能使用任何经典功能。

让我们看一些聚合函数,并希望获得最好的… http://www.postgresql.org/docs/9.4/static/functions-
aggregate.html

json_object_agg是构建对象的唯一聚合函数,这是我们解决此问题的唯一机会。这里的窍门是找到正确的json_object_agg函数功能

这是我的测试表和数据

CREATE TABLE test (
  id    SERIAL PRIMARY KEY,
  json1 JSONB,
  json2 JSONB
);

INSERT INTO test (json1, json2) VALUES
  ('{"a":"b", "c":"d"}', '{"e":"f"}'),
  ('{"a1":"b2"}', '{"f":{"g" : "h"}}');

经过一些试验和错误之后,json_object您可以在PostgreSQL 9.4中合并json1和json2

WITH all_json_key_value AS (
  SELECT id, t1.key, t1.value FROM test, jsonb_each(json1) as t1
  UNION
  SELECT id, t1.key, t1.value FROM test, jsonb_each(json2) as t1
)
SELECT id, json_object_agg(key, value) 
FROM all_json_key_value 
GROUP BY id

编辑 :对于PostgreSQL 9.5+,请看下面的Zubin的答案



 类似资料:
  • 是否可以在JPA中查询“union”,甚至在“Criteria Builder”中查询“union”? 还是使用本机SQL?

  • 前面介绍了如何使用 WHERE 给查询加上条件约束,本小节介绍如何使用 UNION 联合查询。实际业务中,有时候需要把满足多种独立条件的结果集整合到一起,就可以使用 UNOIN 联合查询,本小节介绍 UNION 和 UNION ALL 的用法和区别。 1.UNION ALL联合查询 同样为了演示方便,先向 teacher 表插入多条测试数据: INSERT INTO teacher (name,a

  • 问题内容: 说我们有一张桌子 我们可以在SQL中通过发出单个查询而不用在后端代码中循环进行联接来检索跨行的字段的连接吗? 就像是 应该给像这样的结果 问题答案: 如果使用MySQL,则可以使用GROUP_CONCAT:

  • 问题内容: 我有一个这样的表: SQL查询应如何汇总以下结果: 问题答案: 注意:STUFF函数只是从返回的字符串中删除前导/。

  • 问题内容: 我正在使用SQL Server,并且我有两个表,我想合并为一个查询,用它来填充gridview。 表1 dbo.Work UID(PK,int) Tech_Ticket(int) RMA_Ticket(int) 区域(nchar10) 已完成(nchar10) FA(nchar10) 代理(nvarchar50) 跟踪(nvarchar50) Date_Added(date) Date

  • 问题内容: 我有一个联合查询,它从两个不同的总体中获取计数。如何强制结果按查询中写入的顺序而不是升序/降序返回? 我希望第一个结果始终作为第一行返回。这可能吗? 问题答案: 您必须使用ORDER BY子句指定订单。在您的示例中,您可以执行以下操作: