当前位置: 首页 > 知识库问答 >
问题:

PostgreSQL:如何得到一个json,其中一列是键,另一列是值?

申光临
2023-03-14
CREATE TABLE devices(
                     repliesto    TEXT PRIMARY KEY CHECK (repliesto <> ''), 
                     devicetokens TEXT[] NOT NULL 
                       CHECK (ARRAY_LENGTH(devicetokens, 1) IS NOT NULL 
                          AND ARRAY_LENGTH(devicetokens, 1) > 0)
);
SELECT * FROM devices ;
{"user1": ["a"], "user2": ["b","c"]}
SELECT jsonb_agg(json_build_object(repliesto, devicetokens)) FROM devices;
[{"user1": ["a"]}, {"user2": ["b", "c"]}]

这与我想要的不同,因为它是作为JSON的每个单独行的数组。我想要一个json(不是数组),其中Repliesto列是键,DeviceTokens数组是值。我怎么能那么做?

共有1个答案

公羊喜
2023-03-14

在PostgreSQL V9.5+中,有一个聚合函数json_object_agg(name,value)

SELECT 
  json_object_agg(repliesto, array_to_json(devicetokens))
FROM 
  devices;

结果:

{ "user1" : ["a"], "user2" : ["b","c"] }

欢迎您在DB<>Fiddle中试用

 类似资料:
  • 问题内容: 我需要验证列表是否是另一个列表的子集-我想要的只是布尔返回值。 在相交后在较小列表上测试相等性是最快的方法吗?考虑到需要比较的数据集数量,性能至关重要。 根据讨论添加更多事实: 在许多测试中,两个列表中的两个列表是否相同?它作为静态查找表之一来执行。 需要列表吗?事实并非如此-静态查找表可以是执行效果最好的任何内容。动态命令是一种dict,我们从中提取密钥以执行静态查找。 在这种情况下

  • 问题内容: 如何测试一个列表是否包含另一个列表(即它是一个连续的子序列)。假设有一个名为contains的函数: 编辑: 问题答案: 这是我的版本: 正如安德鲁·贾菲(Andrew Jaffe)在他的评论中指出的那样,它返回一个元组(start,end + 1),因为我认为这更像pythonic。它不对任何子列表进行切片,因此应该相当有效。 新手感兴趣的一点是,它使用了for语句上的else子句-

  • 问题内容: 我有一个产品ID列表,我想找出哪些订单包含所有这些产品。订单表的结构如下: 显然,我可以使用PHP中的一些循环来做到这一点,但是我想知道是否有一种优雅的方法可以完全在mysql中完成。我理想的幻想查询将是这样的: 有希望还是我应该去阅读托尔金?:)另外,出于好奇,如果不能在mysql中使用,是否还有其他具有此功能的数据库? 问题答案: 你很亲密 关于关系代数中的“出于好奇”问题,这可以

  • 我有两张桌子: null null null null 我不知道现在该做什么(一些脚本?)。我需要将表列中的值更改为表列中的相应值。 如果太混乱,我会试着举一个正常数据的例子: 表1中的行(oldprimarykey、sometext、newprimarykey): null null

  • 问题内容: [‘a’,’a’,’b’,’c’,’c’,’c’] 至 和 问题答案: x=[‘a’,’a’,’b’,’c’,’c’,’c’] >>> map(x.count,x) [2, 2, 1, 3, 3, 3] >>> dict(zip(x,map(x.count,x))) {‘a’: 2, ‘c’: 3, ‘b’: 1} >>>

  • 问题内容: 我有一个表,其中包含商店中每件商品的单价和其他详细信息。 另一个包含每个订单中包含的项目的详细信息。 现在我要计算 请注意,我希望它成为表本身的一部分,而不是作为其他视图或查询。我怎样才能做到这一点?我为此研究了触发器和其他机制,但是它们是否适用于不同表中的值,尤其是在存在此类约束的情况下? 我尝试过根据另一列计算出的Column进行以下触发吗?: 但这似乎没有用 问题答案: 这是如何