如何在postgresql中创建一个空的JSON对象?

时间:2015-10-23 14:34:51

标签: json postgresql postgresql-9.4

数据模型

人在数据库中表示为具有名称和多个属性的元表行,这些属性作为键值对存储在数据表中(键和值在单独的列中)。 Datamodel 简化数据模型

现在有一个查询可以检索所有用户(名称)及其所有属性(数据)。这些属性在单独的列中作为JSON对象返回。这是一个例子:

name      data
Florian   { "age":25 }
Markus    { "age":25, "color":"blue" }
Thomas    {}

SQL命令如下所示:

SELECT
  name,
  json_object_agg(d.key, d.value) AS data,
FROM meta AS m
JOIN (
  JOIN d.fk_id, d.key, d.value AS value FROM data AS d
  ) AS d
ON d.fk_id = m.id
GROUP BY m.name;

问题

现在我遇到的问题是,表中没有任何属性的用户喜欢托马斯,我的选择功能不会显示。这是因为它只有JOIN而没有LEFT OUTER JOIN

如果我使用LEFT OUTER JOIN,我会遇到问题,json_object_agg尝试聚合NULL值并因错误而死亡。

途径

1。返回键和值的空列表

因此,我尝试检查用户的键列是否为NULL并返回一个空数组,以便json_object_agg只创建一个空 JSON < / strong>对象。

但实际上没有一个函数可以在SQL中创建一个空数组。我发现的最接近的是:

select '{}'::text[];

COALESCE结合使用时,查询如下所示:

json_object_agg(COALESCE(d.key, '{}'::text[]), COALESCE(d.value, '{}'::text[])) AS data

但是如果我尝试使用它,我会收到以下错误:

ERROR:  COALESCE types text and text[] cannot be matched
LINE 10:     json_object_agg(COALESCE(d.key, '{}'::text[]), COALES...
                                                ^
Query failed
PostgreSQL said: COALESCE types text and text[] cannot be matched

所以看起来在运行时d.key是单个值而不是数组。

2。拆分JSON创建并返回空列表

所以我尝试使用json_object_agg并将json_object替换为汇总键的json_object(COALESCE(array_agg(d.key), '{}'::text[]), COALESCE(array_agg(d.value), '{}'::text[])) AS data

null value not allowed for object key

但是我得到COALESCE的错误。因此contact_id = lodger_id不会检查数组是否为空。

Qustion

那么,是否有一个函数来检查连接列是否为空,如果是,则只返回一个简单的JSON对象?

还是有其他解决方案可以解决我的问题吗?

1 个答案:

答案 0 :(得分:21)

left joincoalesce()一起使用。默认值使用'{}'::json

select name, coalesce(d.data, '{}'::json) as data
from meta m
left join (
    select fk_id, json_object_agg(d.key, d.value) as data
    from data d
    group by 1
    ) d
on m.id = d.fk_id;

  name   |                data                
---------+------------------------------------
 Florian | { "age" : "25" }
 Marcus  | { "age" : "25", "color" : "blue" }
 Thomas  | {}
(3 rows)