Я пытаюсь понять, как расширить поле JSONB с jsonb_to_recordset
и пользовательским типом.
Postgres 11.4.
Это всего лишь тестовый пример, но на минуту я пытаюсь выработать синтаксис. У меня есть таблица с именем data_file_info
с полем JSONB с именем table_stats
. Поле JSONB всегда включает в себя массив JSON с одинаковой структурой:
[
{"table_name":"Activity","record_count":0,"table_number":214},
{"table_name":"Assembly","record_count":1,"table_number":15},
{"table_name":"AssemblyProds","record_count":0,"table_number":154}
]
Следующий код работает правильно:
from data_file_info,
jsonb_to_recordset(table_stats) as table_stats_splat (
table_name text,
record_count integer,
table_number integer
)
Что я хотел бы сделать, это передать определение типа Custmвместо приведенного выше списка определений столбцов. Вот соответствующий тип:
create type data.table_stats_type as (
table_name text,
record_count integer,
table_number integer)
Некоторые примеры, которые я видел, и документы говорят, что вы можете предоставить имя типа, используя приведение null:row_type
в первом параметре кjsonb_to_recordset
. Примеры, которые я нашел, используют встроенный JSON, пока я пытаюсь получить сохраненный JSON. Я сделал несколько попыток, все провалились. Ниже приведены два испытания с ошибками. Может ли кто-нибудь указать мне правильный синтаксис?
FAIL :
select table_stats_splat.*
from data_file_info,
jsonb_populate_recordset(null::table_stats_type, data_file_info) as table_stats_splat;
-- ERROR: function jsonb_populate_recordset(table_stats_type, data_file_info) does not exist
-- LINE 4: jsonb_populate_recordset(null::table_stats_type, dat...
^
-- HINT: No function matches the given name and argument types. You might need to add explicit type casts. (Line 4)
FAIL :
select *
from jsonb_populate_recordset(NULL::table_stats_type, (select table_stats from data_file_info)) as table_stats_splat;
-- ERROR: more than one row returned by a subquery used as an expression. (Line 2)
IЯ, несомненно, упускаю что-то довольно очевидное, и я надеюсь, что кто-то может подсказать, что это такое.