Передача типа строки в синтаксические ошибки jsonb_to_recordset - PullRequest
2 голосов
/ 18 октября 2019

Я пытаюсь понять, как расширить поле 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Я, несомненно, упускаю что-то довольно очевидное, и я надеюсь, что кто-то может подсказать, что это такое.

1 Ответ

2 голосов
/ 18 октября 2019

Используйте столбец в качестве второго параметра:

select table_stats_splat.*
from data_file_info,
    jsonb_populate_recordset(null::table_stats_type, table_stats) as table_stats_splat;
...