Распаковка и использование данных JSONB в качестве функции PL / Pg SQL в версии 11.7 - PullRequest
1 голос
/ 09 мая 2020

Я работаю над функцией, которая принимает пару массивов JSON и некоторые значения настроек, а затем выполняет сравнение между элементами в массивах. В преддверии этого я пытаюсь проанализировать JSONB в PG / Pl SQL. Эта версия с жестко запрограммированным JSON в теле функции работает:

CREATE OR REPLACE FUNCTION tools.try_unpacking_hard_coded (
     base_jsonb_in                        jsonb)

RETURNS TABLE (
    base_text                             citext,
    base_id                               citext)
AS $BODY$

BEGIN

RETURN QUERY

with
base_expanded AS (
 select *
   from json_populate_recordset(
        null::record,
          '[
             {"base_text":"Red Large Special","base_id":1},
             {"base_text":"Blue Small","base_id":5},
             {"base_text":"Green Medium Special","base_id":87}
           ]')
      AS unpacked (base_text citext, base_id citext)
 )

select base_expanded.base_text,
       base_expanded.base_id

  from base_expanded;

END
$BODY$
LANGUAGE plpgsql;

Вот пример вызова и вывода:

select * from try_unpacking_hard_coded('{}'::jsonb);
base_text           base_id
Red Large Special        1
Blue Small               5
Green Medium Special    87

Однако, когда я пытаюсь передать текст JSON и анализируя его как параметр, я не получаю ничего, кроме результатов NULL. Я получаю правильное имя и количество столбцов, а также правильное количество строк ... но без значений.


CREATE OR REPLACE FUNCTION tools.try_unpacking (
     base_jsonb_in   jsonb)

RETURNS TABLE (
    base_text         citext,
    base_id           citext)

AS $BODY$

BEGIN

RETURN QUERY

WITH
base_expanded AS (

 select *
   from jsonb_populate_recordset(
          null::record,
          base_jsonb_in)
      AS base_unpacked (base_text citext, base_id citext)
 )

select base_expanded.base_text,
       base_expanded.base_id

  from base_expanded;

END 
$BODY$
LANGUAGE plpgsql;

Вот вызов:

select *  from try_unpacking (
'[{"text":"Red Large Special","id":"1"},
{"text":"Blue Small","id":"5"},
{"text":"Green Medium Special","id":"87"}]'
);

И результат:

base_text   base_id
NULL        NULL
NULL        NULL
NULL        NULL

Может ли кто-нибудь указать мне правильное направление, чтобы исправить это?

Продолжение

Барбарос Озхан любезно указал на мою ошибку, вот рабочая версия:

CREATE OR REPLACE FUNCTION tools.try_unpacking (
     base_jsonb_in   jsonb)

RETURNS TABLE (
    base_text         citext,
    base_id           citext)

AS $BODY$

BEGIN

RETURN QUERY

WITH
base_expanded AS (

 select *
   from jsonb_populate_recordset(
          null::record,
          base_jsonb_in)
      AS base_unpacked (text citext, id citext)
 )

select base_expanded.text AS base_text,
       base_expanded.id AS base_id

  from base_expanded;

END 
$BODY$
LANGUAGE plpgsql;

Кстати, причина переименования в том, что теперь у меня будет второй параметр со значениями comparison.

1 Ответ

1 голос
/ 10 мая 2020

Ключевые значения для значения JSON в качестве аргумента функции должны соответствовать определенным индивидуальным псевдонимам для соответствующих столбцов, возвращаемых из функции jsonb_populate_recordset():

CREATE OR REPLACE FUNCTION try_unpacking (
     base_jsonb_in   jsonb)

RETURNS TABLE (
    base_text        varchar(100),
    base_id          varchar(100))

AS $BODY$

BEGIN

RETURN QUERY

WITH
base_expanded AS (

 select *
   from jsonb_populate_recordset(
          null::record,
          base_jsonb_in)
      AS base_unpacked (bt varchar(100), bi varchar(100))
 )
select b.bt, b.bi
  from base_expanded b;

END 
$BODY$
LANGUAGE plpgsql;

select *  from try_unpacking (
'[{"bt":"Red Large Special","bi":"1"},
{"bt":"Blue Small","bi":"5"},
{"bt":"Green Medium Special","bi":"87"}]'
);

base_text               base_id
Red Large Special       1
Blue Small              5
Green Medium Special    87

Обратите внимание, что заголовки столбцов поскольку возвращенные записи по-прежнему сохраняются как base_text и base_id из них в разделе

RETURNS TABLE (
    base_text        varchar(100),
    base_id          varchar(100)
)

.

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...