将列和jsonb对象数组合并到单个jsonb列

时间:2016-07-21 13:55:49

标签: sql postgresql

我有一张表visitors(id, email, first_seen, sessions, etc.)

和另一个存储自定义用户提供的数据的表trackings(id, visitor_id, field, value)

我想查询这些内容并将访问者数据列和跟踪合并到一个名为data

的列中

例如,假设我有两个跟踪

(id: 3, visitor_id: 1, field: "orders_made", value: 2)
(id: 4, visitor_id: 1, field: "city", value: 'new york')

和访客

(id: 1, email: 'hello@gmail.com, sessions: 5)

我希望结果是

的形式
(id: 1, data: {email: 'hello@gmail.com', sessions: 5, orders_made: 2, city: 'new york'})

使用Postgres 9.4实现此目的的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我首先要说跟踪是一个坏主意。如果你没有很多东西要跟踪,只需存储json;这就是为它做的。如果你有很多事情需要跟踪,那么随着时间的推移你会对跟踪的表现感到非常不满。

首先,你需要一个来自追踪的json对象:

-- WARNING: Behavior of this with duplicate field names is undefined!
SELECT json_object(array_agg(field), array_agg(value)) FROM trackings WHERE ...

为访客获取json相对容易:

SELECT row_to_json(email, sessions) FROM visitors WHERE ...;

我建议你不要把所有这些压在一起。如果您有一个名为电子邮件的字段会怎样?代替:

SELECT row_to_json((SELECT 
  (
SELECT row_to_json(email, sessions) FROM visitors WHERE ...
  ) AS visitor
  , (
SELECT json_object(array_agg(field), array_agg(value)) FROM trackings WHERE ...
  ) AS trackings
));