2

在以下代码示例中,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}
4

2 回答 2

3

是的,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
于 2015-05-06T07:03:39.317 回答
0

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

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

于 2015-05-07T07:56:11.150 回答