gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:14:33 31 4
gpt4 key购买 nike

数据模型

一个人在数据库中表示为元表行,具有名称和多个属性,这些属性作为键值对存储在数据表中(键和值在单独的列中)。 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;

问题

现在我面临的问题是,像 Thomas 这样没有任何属性存储在 key-value 表中的用户没有显示在我的选择函数中.这是因为它只执行 JOIN 而没有执行 LEFT OUTER JOIN

如果我使用 LEFT OUTER JOIN 然后我遇到了问题,json_object_agg 尝试聚合 NULL 值并因错误而死.

方法

1。返回空的键和值列表

所以我尝试检查用户的 key-column 是否为 NULL 并返回一个空数组,这样 json_object_agg 就会创建一个空的 JSON 对象。

但是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 ,它不会为我聚合 key :

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

但是我得到了这样的错误:对象键不允许空值。所以 COALESCE 不会检查数组是否为空。

问题

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

或者是否有任何其他解决方案可以解决我的问题?

最佳答案

使用 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)

关于json - 如何在 postgresql 中创建一个空的 JSON 对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33304983/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com