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)
但是,如何获得嵌套的“字段”?任何帮助是极大的赞赏!
关于什么:
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)
归档时间: |
|
查看次数: |
4167 次 |
最近记录: |