【问题标题】:Selecting a JSON object of arrays from a PostgreSQL table从 PostgreSQL 表中选择数组的 JSON 对象
【发布时间】:2018-06-11 12:27:36
【问题描述】:

我准备了一个简单的SQL Fiddle 来演示我的问题 -

在一个两人游戏中,我将用户聊天存储在一个表格中:

CREATE TABLE chat(
    gid integer,            /* game id */
    uid integer,            /* user id */
    created timestamptz,
    msg text
);

这里我用一个简单的测试数据填表:

INSERT INTO chat(gid, uid, created, msg) VALUES
    (10, 1, NOW() + interval '1 min', 'msg 1'),
    (10, 2, NOW() + interval '2 min', 'msg 2'),
    (10, 1, NOW() + interval '3 min', 'msg 3'),
    (10, 2, NOW() + interval '4 min', 'msg 4'),
    (10, 1, NOW() + interval '5 min', 'msg 5'),
    (10, 2, NOW() + interval '6 min', 'msg 6'),
    (20, 3, NOW() + interval '7 min', 'msg 7'),
    (20, 4, NOW() + interval '8 min', 'msg 8'),
    (20, 4, NOW() + interval '9 min', 'msg 9');

我可以通过运行 SELECT 查询来获取数据:

SELECT ARRAY_TO_JSON(
  COALESCE(ARRAY_AGG(ROW_TO_JSON(x)), 
           array[]::json[])) FROM (
SELECT
    gid,
    uid,
    EXTRACT(EPOCH FROM created)::int AS created,
    msg
FROM chat) x;

返回一个 JSON 数组:

[{"gid":10,"uid":1,"created":1514813043,"msg":"msg 1"},
 {"gid":10,"uid":2,"created":1514813103,"msg":"msg 2"},
 {"gid":10,"uid":1,"created":1514813163,"msg":"msg 3"},
 {"gid":10,"uid":2,"created":1514813223,"msg":"msg 4"},
 {"gid":10,"uid":1,"created":1514813283,"msg":"msg 5"},
 {"gid":10,"uid":2,"created":1514813343,"msg":"msg 6"},
 {"gid":20,"uid":3,"created":1514813403,"msg":"msg 7"},
 {"gid":20,"uid":4,"created":1514813463,"msg":"msg 8"},
 {"gid":20,"uid":4,"created":1514813523,"msg":"msg 9"}]

这接近我需要的,但是我想使用“gid”作为 JSON 对象属性,其余数据作为该对象中的值:

{"10": [{"uid":1,"created":1514813043,"msg":"msg 1"},
        {"uid":2,"created":1514813103,"msg":"msg 2"},
        {"uid":1,"created":1514813163,"msg":"msg 3"},
        {"uid":2,"created":1514813223,"msg":"msg 4"},
        {"uid":1,"created":1514813283,"msg":"msg 5"},
        {"uid":2,"created":1514813343,"msg":"msg 6"}],

 "20": [{"uid":3,"created":1514813403,"msg":"msg 7"},
        {"uid":4,"created":1514813463,"msg":"msg 8"},
        {"uid":4,"created":1514813523,"msg":"msg 9"}]}

使用PostgreSQL JSON functions可以做到吗?

【问题讨论】:

    标签: sql json postgresql select postgresql-json


    【解决方案1】:

    我认为您正在为最后一步寻找json_object_agg。这是我的做法:

    SELECT  json_object_agg(
              gid::text, array_to_json(ar)
            )
    FROM    (
      SELECT  gid,
              array_agg(
                json_build_object(
                  'uid', uid,
                  'created', EXTRACT(EPOCH FROM created)::int,
                  'msg', msg)
              ) AS ar
      FROM    chat
      GROUP BY gid
    ) x
    ;
    

    我放弃了coalesce,因为我认为空数组是不可能的。但是,如果您的实际查询可能需要它的更复杂的东西,它应该很容易放回去。

    【讨论】:

      猜你喜欢
      • 2020-08-17
      • 1970-01-01
      • 2020-08-30
      • 1970-01-01
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多