【问题标题】:PostgreSQL: Create JSON message with specific Objects selected in an ArrayPostgreSQL:使用数组中选择的特定对象创建 JSON 消息
【发布时间】:2021-01-19 06:00:17
【问题描述】:

我有这种格式的数据:

[{"id":"b","type":"user"},{"id":"c","type":"system"}]

想要生成只选择“id”的 JSON 消息,例如:

[{"id":"b"},{"id":"c"}]

到目前为止,我只能拆分它们并删除“类型”,然后与 [] 连接

select json_array_elements_text(column1)::jsonb #- '{type}'
from (
    select '[{"id":"b","type":"user"},{"id":"c","type":"system"}]'::json as column1
) t

有没有更好的方法(我确定有),请帮忙谢谢。

编辑:

以后可能会添加除“id”和“type”之外的其他属性,代码只需要引用“id”即可。 [{"id":"b","type":"user"},{"id":"c","type":"system"}, {"id":"d","type":"system", "flag":"Y"}]

【问题讨论】:

  • jsonb 会有所改善,但正确的解决方案是避免在数据库中使用 JSON 并规范化数据模型。
  • 感谢@LaurenzAlbe的回复,源数据是系统生成的上述格式的JSON消息,我只需要“id”组件并通过API Post将其传递给单独的系统。如果我可以只应用几个函数来获得结果,那将是理想的。

标签: sql json postgresql api object


【解决方案1】:

我必须建议下一个流程:

select array_agg(row_to_json(t.*)) from (
    select id
    from jsonb_to_recordset('[{"id":"b","type":"user"},{"id":"c","type":"system"}]'::jsonb) as x(id varchar, type varchar)
) t;

你可以play SQL here

【讨论】:

  • 感谢@Slava,我想知道是否有办法避免使用“类型”键,因为将来可能会向对象添加其他属性或键值对。
【解决方案2】:

我找到了一个没有引用 JSON 对象中其他属性的答案。

select json_agg(json_build_object('id', id)) as id
from (
    select json_array_elements('[{"id":"b","type":"user"},{"id":"c","type":"system"}, {"id":"d","type":"system", "flag":"Y"}]'::json)::json->'id' as id
    ) t

【讨论】:

    猜你喜欢
    • 2022-01-05
    • 2018-06-11
    • 1970-01-01
    • 2021-04-14
    • 1970-01-01
    • 2018-08-18
    • 2017-10-06
    • 2022-12-04
    • 1970-01-01
    相关资源
    最近更新 更多