假设我有以下内容,

CREATE TABLE IF NOT EXISTS my_schema.user (
    id serial PRIMARY KEY,
    user_name VARCHAR (50) UNIQUE NOT NULL
);

CREATE TABLE IF NOT EXISTS my_schema.project (
    id serial PRIMARY KEY,
    project_name VARCHAR (50) UNIQUE NOT NULL,
    owner BIGINT NOT NULL REFERENCES my_schema.user (id),
    collaborators BIGINT[] DEFAULT array[]::bigint[]
);

INSERT INTO my_schema.user VALUES
 (1 ,'Mike')
,(2 ,'Peter')
,(3 ,'Roger');

INSERT INTO my_schema.project VALUES
 (1 ,'project1', 1, array[2, 3])
,(2 ,'project2', 1, array[]::integer[]);

如果我按以下方式进行查询,它工作得很好,因为至少有一个协作者:

SELECT
    s.id,
    s.project_name,
    (
        SELECT to_json(array_agg(c.*))
        FROM my_schema.user as c
        WHERE c.id = ANY(s.collaborators)
    ) as collaborators,
    json_build_object(
        'id', u.id,
        'user_name', u.user_name
    ) as user
FROM my_schema.project s
INNER JOIN my_schema.user u
    ON s.owner = u.id
WHERE s.id = 2

但如果我改变

WHERE s.id = 2

WHERE s.id = 1

然后在collaborators字段中返回null.

我try 了多种组合,将其转换为::BIGINT[]和使用NULLIF,但都没有效果.我做错了什么?

推荐答案

使用COALESCE():

COALESCE((
    SELECT to_json(array_agg(c.*))
    FROM "user" as c
    WHERE c.id = ANY(s.collaborators)
), to_json(array[]::json[])) as collaborators

See the demo.

请注意,即使是一个简单的'[]'也可以用于演示目的:

COALESCE((
    SELECT to_json(array_agg(c.*))
    FROM "user" as c
    WHERE c.id = ANY(s.collaborators)
), '[]') as collaborator

Json相关问答推荐

我可以使用JQ来缩小数组中的json对象的范围吗?

创建Json嵌套文件 struct

将=分隔值文件转换为:json文件

将来自 Golang 的 JSON API 调用响应输出到 nextjs 前端

使用杰克逊解析Kotlin 中的通用密封类

阅读 JSON 正文 Firebase 云函数

使用带有逗号的字段名称构建 struct

使用非美国日期格式时,JsonConvert.DeserializeObject 无法将字符串转换为 DateTime

Flask 请求和 application/json 内容类型

从 HttpResponse 获取 json

使用 Spring 和 JsonTypeInfo 注释将 JSON 反序列化为多态对象模型

了解 JSON Schema 草稿版本 4 中的additionalProperties关键字

如何在 django rest 框架中定义列表字段?

字符串的 Gson 数组到 JsonArray

如何在 Python 中合并两个 json 字符串?

有 Json 标签但未导出

确保数组中的项目属性在 Json Schema 中是唯一的?

Laravel 5 控制器将 JSON 整数作为字符串发送

从 JSON 中 Select 不同的值

按键值过滤 JSON