jsonb_agg和json_agg
时间: 2023-10-29 18:50:58 浏览: 41
`jsonb_agg`和`json_agg`是PostgreSQL中的两个聚合函数,用于将行中的多个JSON值聚合为一个JSON数组。
`json_agg`函数接受一个表达式作为输入,并返回一个以该表达式的结果为元素的JSON数组。这个函数可以用于将多个行中的JSON值聚合到一个数组中。
例如,假设我们有一个名为`users`的表,其中包含以下数据:
```
id | name | attributes
---+-------+-------------------
1 | Alice | {"age": 25}
2 | Bob | {"age": 30}
3 | John | {"age": 35}
```
我们可以使用`json_agg`函数将所有用户的属性聚合到一个JSON数组中:
```sql
SELECT json_agg(attributes) FROM users;
```
结果将是一个包含所有用户属性的JSON数组:
```
[{"age": 25}, {"age": 30}, {"age": 35}]
```
而`jsonb_agg`函数与`json_agg`函数类似,区别在于它将JSON值作为`jsonb`类型处理,而不是作为`json`类型处理。`jsonb`类型是PostgreSQL中一种优化存储和查询JSON数据的二进制格式。
总结来说,`json_agg`和`jsonb_agg`函数都用于将多个行中的JSON值聚合到一个JSON数组中,只是在处理JSON数据的方式上略有不同。
相关问题
json_object_agg 有空值时怎么处理
当使用 `json_object_agg` 聚合函数时,如果某个字段的值为 NULL,那么在返回的 JSON 对象中对应的键值对也会是 NULL。如果你希望将这些 NULL 值忽略掉,可以使用 `json_agg` 函数代替 `json_object_agg` 函数。`json_agg` 函数会将 NULL 值排除在外,只将非 NULL 值聚合成一个 JSON 数组。
例如,以下 SQL 语句将查询结果按照 `id` 分组,并将每个分组内的记录转换成一个 JSON 数组:
```
SELECT id, json_agg(json_build_object('name', name, 'age', age)) AS people
FROM my_table
GROUP BY id;
```
如果某个记录的 `name` 或 `age` 字段的值为 NULL,那么该记录对应的 JSON 对象就会包含一个 NULL 值。如果你希望将这些 NULL 值忽略掉,可以将 `json_build_object` 函数替换为 `json_strip_nulls(json_build_object('name', name, 'age', age))`,这样就会在构建 JSON 对象时自动排除 NULL 值。
oracle 自定义 string_agg
在 Oracle 数据库中,可以使用 LISTAGG 函数来实现字符串聚合。如果需要自定义字符串聚合函数,可以使用 PL/SQL 编写一个自定义聚合函数。
下面是一个示例代码,实现了一个自定义的字符串聚合函数 STRAGG:
```
CREATE OR REPLACE TYPE t_stragg
AS OBJECT (
str_agg VARCHAR2(32767),
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_stragg)
RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_stragg,
value IN VARCHAR2) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_stragg,
returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER,
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_stragg,
ctx2 IN t_stragg) RETURN NUMBER
);
CREATE OR REPLACE TYPE BODY t_stragg
IS
STATIC FUNCTION ODCIAggregateInitialize(sctx IN OUT t_stragg)
RETURN NUMBER
IS
BEGIN
sctx := t_stragg(NULL);
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateIterate(self IN OUT t_stragg,
value IN VARCHAR2) RETURN NUMBER
IS
BEGIN
IF self.str_agg IS NULL THEN
self.str_agg := value;
ELSE
self.str_agg := self.str_agg || ',' || value;
END IF;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateTerminate(self IN t_stragg,
returnValue OUT VARCHAR2, flags IN NUMBER) RETURN NUMBER
IS
BEGIN
returnValue := self.str_agg;
RETURN ODCIConst.Success;
END;
MEMBER FUNCTION ODCIAggregateMerge(self IN OUT t_stragg,
ctx2 IN t_stragg) RETURN NUMBER
IS
BEGIN
IF ctx2.str_agg IS NOT NULL THEN
IF self.str_agg IS NULL THEN
self.str_agg := ctx2.str_agg;
ELSE
self.str_agg := self.str_agg || ',' || ctx2.str_agg;
END IF;
END IF;
RETURN ODCIConst.Success;
END;
END;
CREATE OR REPLACE FUNCTION stragg(input VARCHAR2)
RETURN VARCHAR2
PARALLEL_ENABLE AGGREGATE USING t_stragg;
```
使用方法如下:
```
SELECT stragg(column_name) FROM table_name;
```
其中,column_name 是要聚合的列名,table_name 是要聚合的表名。