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