【问题标题】:get array of all json field keys in postgresql获取postgresql中所有json字段键的数组
【发布时间】:2021-10-27 07:20:07
【问题描述】:

我有一个叫user的表,在表里面有一个叫friends的字段,这个字段是json类型,取值如下例

{"blockList": {"199": {"date": 1453197190, "status": 1}, "215": {"date": 1459325611, "status": 1}, "219": {"date": 1454244074, "status": 1}, "225": {"date": 1453981312, "status": 1}, "229": {"date": 1459327685, "status": 1}}, "followers": {"211": {"date": 1452503369}, "219": {"date": 1452764627}, "334": {"date": 1456396375}}, "following": {"215": {"date": 1459325619}, "219": {"date": 1453622322}, "226": {"date": 1454244887}, "229": {"date": 1459327691}}, "friendList": {"213": {"date": 1453622410, "type": 2, "status": 1}, "214": {"date": 1452763643, "status": 1}, "215": {"date": 1455606872, "type": 2, "status": 2}, "218": {"date": 1453280047, "status": 1}, "219": {"date": 1453291227, "status": 2}, "221": {"date": 1453622410, "type": 2, "status": 1}, "224": {"date": 1453380152, "type": 2, "status": 1}, "225": {"date": 1453709357, "type": 2, "status": 2}, "226": {"date": 1454244088, "type": 2, "status": 1}, "229": {"date": 1454326745, "type": 2, "status": 2}}}

此记录有一个 blockList 对象,其中包含被阻止用户的对象。 我需要的是像这样返回一个包含所有阻止列表键的数组

["199", "215", "219", "225", "229"]

任何帮助我如何编写一个 plpgsql 函数来做到这一点(返回数组中的所有对象键)? 我是 psotgresql 的初学者,需要帮助。

【问题讨论】:

    标签: postgresql


    【解决方案1】:

    json_object_keys 用于包含json 对象最外层键的集合(因此您需要为blockList 键选择对象,您可以使用friends->'blockList' 进行操作),并使用array_agg将它们聚合成一个数组:

    SELECT ARRAY_AGG(f) 
    FROM (
      SELECT json_object_keys(friends->'blockList') f
      FROM users
    ) u;
    ┌───────────────────────┐
    │       array_agg       │
    ├───────────────────────┤
    │ {199,215,219,225,229} │
    └───────────────────────┘
    (1 row)
    

    注意:
    如果您使用的是 jsonb 类型(而不是 json 类型),则需要使用 jsonb_object_keys 函数。

    【讨论】:

    • 错误:函数 json_object_keys(jsonb) 不存在第 4 行:选择 json_object_keys(friends->'blockList') f ^ 提示:没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。
    • 如果您使用的是jsonb,那么您需要使用jsonb_object_keys 函数。
    • 哎呀我忘了array_agg,很好的答案。
    【解决方案2】:

    SELECT array_agg(ks) FROM ( SELECT json_object_keys(friends->'blockList') AS ks FROM users ) x

    我创建了一个 SQL fiddle here 来演示。

    注意:user 是保留字,所以我将表格命名为users

    【讨论】:

      【解决方案3】:

      我迟到了,但我想建议以下方式,借用 Erwin here:

      SELECT ARRAY(SELECT json_object_keys(friends->'blockList')) FROM users;
      

      【讨论】:

        猜你喜欢
        • 2019-09-24
        • 1970-01-01
        • 2020-07-10
        • 1970-01-01
        • 2019-03-28
        • 2019-09-26
        • 1970-01-01
        • 2019-08-26
        • 1970-01-01
        相关资源
        最近更新 更多