Postgresql 嵌套 row_to_json 不起作用

max*_*mus 2 postgresql subquery postgresql-9.1

如果我使用 postgresql 9.2,这可能不会成为问题,但是我(还)无法从 9.1 升级,并且我正在使用 9.1 的 json 数据类型扩展。我正在尝试实现如下所示的 json 对象:

[
  { "type": "add"
    , "id":"285947086237736960"
    , "version" : 1
    , "lang":"en"
    ,"fields":  {
        "id" : "285947086237736960"
        , "created_at":"2013-01-01"
        , "content":"bla bla blah LOL ROFL"
    }
  }, ...
]
Run Code Online (Sandbox Code Playgroud)

嵌套的“fields”属性来自名为“tweets”的数据库表。两个 id 来自同一个表。但是,类型、版本、语言始终相同。我查看了/sf/ask/925899971/的建议,其中提到使用别名子查询表达式。这根本不起作用,我仍然得到 f1、f2 等。使用 row_to_json 创建 JSON 时将名称设置为属性的建议适用于单个级别,但我无法让它适用于嵌套“字段” “ 属性。

据我所知,这只适用于类似于以下的 with 语句:

with tweets(type, id) as ( 
    select 'add' as type, tweets.id from tweets 
) select row_to_json(tweets) from tweets;
Run Code Online (Sandbox Code Playgroud)

但是,如何获得嵌套的“字段”?任何帮助是极大的赞赏!

Chr*_*ers 5

关于什么:

with tweets(type, id) as ( 
    select 'add' as type, tweets.id from tweets 
) select row_to_json(row(array_agg(tweets))) from tweets;
Run Code Online (Sandbox Code Playgroud)

这实际上是 PostgreSQL、数组和复杂类型最酷的事情之一。人们可以将它们聚合起来然后进行转换。你应该得到一个有效的结构:

tweets[](即推文元组数组),然后 get 应正确转换为 JSON)。

现在,如果您需要比这更复杂的结构,您可能需要单独定义类型。就像是:

CREATE TYPE tweet_set AS (
    set_id int,
    tweets tweet[],
    generated_at timestamp, 
    ....
);
Run Code Online (Sandbox Code Playgroud)

然后提出一个查询来生成该查询,然后将其转换为 JSON。

基本问题之一是,由于 row_to_json 需要记录类型,因此您必须传入记录,而不是任何数组。你还可以这样做:

with tweets(type, id) as ( 
    select 'add' as type, tweets.id from tweets 
) select array_to_json(array_agg(tweets)) from tweets;
Run Code Online (Sandbox Code Playgroud)