Postgres to-json 将复合类型转换为空结构

Postgres to-json converts a composite type into empty structure

在下面的代码示例中,postgresql (9.4) 应该将复合类型的局部变量转换为 json 字符串。显然 postgresql 处理一个具有空值的变量不同于转换为相同类型的空值。

在我的应用程序中,我有嵌套的复合类型,当复合类型的变量具有 null 作为值时,我想检索 null。

我希望你们中的一些人能帮助我。

CREATE TYPE mytype AS (
    id SMALLINT,
    name TEXT
);

DO $$
DECLARE
    l_var mytype;
BEGIN
    l_var := NULL;
    RAISE INFO '%',to_json(NULL::mytype);
    RAISE INFO '%',to_json(l_var) ;
END $$; 

--Output
INFO:  <NULL>
INFO:  {"id":null,"name":null}

是的,PostgreSQL 区分带空字段的 ROW 和 NULL。修复应该不难 - 您应该使用 CASE 表达式:

postgres=# DO $$
DECLARE
    l_var mytype;
BEGIN
    l_var := NULL;
    RAISE INFO '%',to_json(NULL::mytype);
    RAISE INFO '%',to_json(CASE WHEN l_var IS NULL THEN NULL ELSE l_var END) ;
END $$; 
INFO:  <NULL>
INFO:  <NULL>
DO

不幸的是,pavels 解决方案对我不起作用,因为它已用于另一种类型,因此我无法应用建议的案例结构。

但在与后端开发人员交谈后,他们最好始终收到完整的 json 结构,即使这些字段没有价值。所以从语义的角度来看,postgres 工作正常。