2015-05-06 5 views
2

в следующем примере кода postgresql (9.4) должен преобразовать локальную переменную составного типа в строку json. По-видимому postgresql обрабатывает переменную с нулевым значением, отличным от приведения нулевого значения к тому же типу.Postgres to-json преобразует композитный тип в пустую структуру

В моем приложении у меня есть вложенные составные типы и хотелось бы получить 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} 
+0

Huh, так что в PL/PgSQL присвоение 'NULL' записи var отличается от передачи переменной VUL в NULL. Я бы не догадался. Какая странная бородавка. –

+0

l_var не записывает var, но строка var. –

ответ

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 
+0

Ну, больше обходного решения, чем исправить. Если бы я увидел, что в чьем-то кодексе без пояснительного комментария я бы сделал несколько серьезных «WTF?». –

+1

@CraigRinger - это результат различия между типами RECORD и ROW в Postgres. Типы ROW имеют структуру каждый раз, поэтому он не может быть скалярным NULL. Несколько лет назад этот вопрос был открыт, и результат был: ANSI SQL требует этого, если я помню стену. –

0

Unfortunatly решение Pavels не работает для меня, потому что он используется в другом типе и я не могу применить предложенную прецедентную структуру тогда.

Но после разговора с сторонними разработчиками, лучше для них всегда получать полную структуру json, даже если поля не имеют значения. Итак, с символической точки зрения postgres отлично работает.

+1

Существует еще одна возможность в подготовленном PostgreSQL 9.5. Вы можете использовать функцию json_strip_nulls, которая уменьшает json '{" id ": null," name ": null}' to '{}' –

+0

wow, это было бы круто и точно, что мне нужно. – RootOfProblem

Смежные вопросы