Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在postgresql中创建空JSON对象? 数据模型_Json_Postgresql_Postgresql 9.4 - Fatal编程技术网

如何在postgresql中创建空JSON对象? 数据模型

如何在postgresql中创建空JSON对象? 数据模型,json,postgresql,postgresql-9.4,Json,Postgresql,Postgresql 9.4,一个人在数据库中表示为一个元表行,该行具有一个名称和多个属性,这些属性作为键值对存储在数据表中(键和值在单独的列中)。 简化数据模型 现在有一个查询来检索所有用户(名称)及其所有属性(数据)。属性在单独的列中作为JSON对象返回。以下是一个例子: 名称数据 弗洛里安{“年龄”:25} 马库斯{“年龄”:25,“颜色”:“蓝色”} 托马斯{} SQL命令如下所示: 选择 名称 json_object_agg(d.key,d.value)作为数据, 从meta到m 加入( 将d.fk_id、d.k

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

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

名称数据
弗洛里安{“年龄”:25}
马库斯{“年龄”:25,“颜色”:“蓝色”}
托马斯{}
SQL命令如下所示:

选择
名称
json_object_agg(d.key,d.value)作为数据,
从meta到m
加入(
将d.fk_id、d.key、d.value作为数据中的值连接为d
)AS d
在d.fk_id=m.id上
按m.name分组;
问题 现在我面临的问题是,像Thomas这样没有任何属性存储在key-value表中的用户不会使用我的select函数显示。这是因为它只执行
连接
,不执行
左侧外部连接

如果我使用
LEFT-OUTER-JOIN
,那么我会遇到一个问题,
json\u-object\u-agg
尝试聚合
NULL
值,并因错误而死亡

方法 1.返回键和值的空列表 因此,我尝试检查用户的键列是否为
NULL
,并返回一个空数组,以便
json\u object\u agg
只创建一个空的json对象

但是在SQL中并没有创建空数组的函数。我找到的最接近的东西是:

选择“{}”::text[];
结合
COALESCE
查询如下:

json_object_agg(合并(d.key,{}::text[])、合并(d.value,{}::text[])作为数据
但如果我尝试使用此选项,则会出现以下错误:

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\u object\u agg
并将其替换为
json\u object
,它不会为我聚合键:

json_对象(合并(数组_agg(d.key),'{}':text[]),合并(数组_agg(d.value),'{}':text[])作为数据
但是我得到了一个错误,
null值不允许用于对象键
。因此,
COALESCE
不会检查数组是否为空

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


或者有其他解决方案可以解决我的问题吗?

使用
left join
coalesce()
。作为默认值,使用
“{}”::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)    

“看起来在运行时d.key是单个值而不是数组”-我不确定“在运行时”是什么意思。如果
d.key
是一列,那么您必须知道它是什么类型。从错误消息中,它似乎是类型
text
;所以一个空值应该是
'
(或者
text'
或者
'::text
,如果你想显式的话)。但我认为这将是一个文本列表,因为我引用了整个专栏。但这是我对SQL语法的误解。所以在运行时,我的意思是何时执行查询。啊,是的,我明白了。作为一个更清楚的例子,它引用了一个值而不是整个列,考虑下面的工作:<代码>选择和(Soad Sub + 1)。