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 工作正常。
在下面的代码示例中,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 工作正常。