Postgres to-json преобразует составной тип в пустую структуру

В следующем примере кода 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}

2 ответа

Решение

Да, 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 работает нормально.

Другие вопросы по тегам