【问题标题】:postgres inverse of json_eachjson_each 的 postgres 逆
【发布时间】:2017-06-27 05:14:47
【问题描述】:

我的字段中没有 json 文本。我有一行"text","format","keyname","..." 列,我想以'{"value of keyname column": {"text":"value of text","format":"value of format",... }}' 格式将其导出为json。在 postgresql 中可以吗?

我一直在查看 postgis2geojson 示例,并且已经了解了 row_to_json 函数。 http://www.postgresonline.com/journal/archives/267-Creating-GeoJSON-Feature-Collections-with-JSON-and-PostGIS-functions.html

此外,我一直在查看 postgres json 文档:http://www.postgresql.org/docs/9.3/static/functions-json.html

不幸的是,我没有找到明确满足我需要的功能,但 json_each 却在相反的方向上做了我想要的。一般来说,我认为postgres中的json函数是在假设只有列名可以用作键的情况下设计的。我对吗?有没有我可以用来解决这个问题的 SQL hack?感谢您的帮助。

编辑:

select '"'||keyname||'":"'||row_to_json((select r from(Select text, format,
    (select username from my.users where users.id = table.uid) as username,
    machinename ) as r ))||'"'
    from my.table where id = 1;

【问题讨论】:

  • 我认为你要求 PostgreSQL 为你做表示层,PostgresSQL 和其他 SQL 服务器不会进入 - 除非你自己使用存储过程。
  • row_to_json() 有什么问题?
  • PostgresSQL不是已经通过提供json转换进入表现层了吗?我的意思是有一个功能可以做我想要的,但方向相反。关于 row_to_json():我有一列“keyname”,我希望该列的 VALUES 显示为 json-key。没有设法用 row_to_json() 做到这一点。你呢?

标签: json postgresql


【解决方案1】:

从 9.4 版开始,postgres 具有 json_object_agg 函数,它是 json_each 的反函数。你可以阅读文档here

如果数据如下所示:

> select * from example;
 text | format | keyname 
------+--------+---------
 foo  | bar    | a
 dead | beef   | b
(2 rows)

然后您可以使用以下查询将所有这些聚合到具有键 ab 的对象中:

> select json_object_agg(keyname, json_build_object('text', text, 'format', format)) from example;
                                     json_object_agg                                      
------------------------------------------------------------------------------------------
 { "a" : {"text" : "foo", "format" : "bar"}, "b" : {"text" : "dead", "format" : "beef"} }
(1 row)

【讨论】:

    【解决方案2】:

    为了保持 API 干净,我实际上会做一些不同的事情。你目前有这个:

    select '"'||keyname||'":"'||row_to_json((select r from(Select text, format,
        (select username from my.users where users.id = table.uid) as username,
        machinename ) as r ))||'"'
        from my.table where id = 1;
    

    你会得到这个:

    WITH full_r AS (select keyname, text, format, username, machinename 
                      FROM my.table JOIN my.users ON users.id = table.uid
                      WHERE id = 1),
         small_r AS (select text, format, username, machinename FROM full_r)
    SELECT f.keyname, row_to_json(s)
      FROM small_r s CROSS JOIN full_r f;
    

    这假设只返回一行。如果您使用多行,则需要内部联接而不是交叉联接。

    【讨论】:

      猜你喜欢
      • 2019-11-11
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      • 2022-01-20
      • 2016-05-26
      • 2017-05-09
      • 2021-10-29
      • 1970-01-01
      相关资源
      最近更新 更多