arrays - 如何将从嵌套选择返回的空值转换为空数组?

标签 arrays json postgresql coalesce

假设我有以下内容,

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

我尝试了将其转换为 ::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

请参阅demo .

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

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

关于arrays - 如何将从嵌套选择返回的空值转换为空数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72966402/

相关文章:

java - 如何提高操作大型数组的性能?

javascript - 具有 2 个数组的类数组

javascript - 根据javascript中的另一个对象数组过滤对象数组

python - 如何使用 Pydantic 将此数据结构转换为 JSON?

sql - 查找字段值全部为 LOWERCASE 的记录

javascript - 如何查找数组中所有出现的元素的索引?

python - 如何将多值 CSV 转换为 Json

javascript - 使用 D3.js 从 MySQL 数据库绘制条形图

postgresql - 当 RDS Postgres DB 被删除时,它是否清除连接的 Redis Elasticache?

c - 如何对 PostgreSQL C 语言函数进行单元测试