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

Postgres到json将复合类型转换为空结构,json,postgresql,to-json,Json,Postgresql,To Json,在下面的代码示例中,postgresql(9.4)应该将复合类型的局部变量转换为json字符串。显然,postgresql处理的变量的空值与转换为同一类型的空值不同 在我的应用程序中,我有嵌套的复合类型,当复合类型的变量的值为null时,我希望检索null 我希望你们中的一个能在这里帮助我 CREATE TYPE mytype AS ( id SMALLINT, name TEXT ); DO $$ DECLARE l_var mytype; BEGIN l_v

在下面的代码示例中,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}
将类型mytype创建为(
id SMALLINT,
名称文本
);
做$$
声明
l_var mytype;
开始
l_var:=NULL;
将信息“%”提升为_json(NULL::mytype);
将信息“%”提升为_json(l_var);
完(元);
--输出
信息:
信息:{“id”:null,“name”:null}

是,PostgreSQL区分字段为空的行和空的行。修复不应该很难-您应该使用用例表达式:

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
postgres=#DO$$
声明
l_var mytype;
开始
l_var:=NULL;
将信息“%”提升为_json(NULL::mytype);
将信息“%”提升到_json(当l_var为NULL时,为NULL,否则为l_var END);
完(元);
信息:
信息:
做

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


但是在与后端开发者交谈之后,最好让他们始终接收完整的json结构,即使这些字段没有任何价值。因此,从symantic的角度来看,postgres工作得很好。

Huh,因此在PL/PgSQL中,将
NULL
赋值给记录变量不同于将
NULL
记录变量传递给函数。我不会猜到的。多么奇怪的一个缺点。l_变量不是记录变量,而是行变量。嗯,解决方法比修复方法多。如果我看到某人的代码中没有解释性的注释,我会做一些严肃的“WTF?”。@CraigRinger-这是Postgres中记录和行类型不同的结果。行类型每次都具有结构,因此不能为标量NULL。几年前,这个问题被提出了,结果是——如果我记得wall的话,ANSI SQL要求这种行为。在准备好的PostgreSQL 9.5中还有另一种可能性。您可以使用json_strip_nulls函数,将json
{“id”:null,“name”:null}
减少到
{}