L OOP - JSON данные в хранимой процедуре Postgres - PullRequest
0 голосов
/ 27 января 2020

Моя таблица fpo выглядит следующим образом:

 id                             fo_data
  1          {"bene_first_name":{"value":"Chris1"},"bene_last_name":{"value":"Ronald"}}
  2          {"bene_first_name":{"value":"John"},"bene_last_name":{"value":"Wick"}}
  1          {"bene_first_name":{"value":"James"},"bene_last_name":{"value":"Cooper"}}

Я создал хранимую процедуру, как показано ниже, и я пытаюсь собрать все данные определенного столбца "fo_data" sh в одну переменную JSON и я пытаюсь l oop полученные JSON данные

CREATE OR REPLACE FUNCTION file_compare()
RETURNS TEXT LANGUAGE 'plpgsql' COST 100 VOLATILE AS $BODY$
DECLARE
  fpo_data jsonb;
  i JSONB;
BEGIN
  SELECT json_agg((fpdata))::jsonb
  FROM (SELECT fo_data AS fpdata
        FROM fpo LIMIT 100
    ) t  INTO fpo_data; 
  FOR i IN SELECT * FROM jsonb_array_elements(fpo_data) LOOP
    RAISE NOTICE 'output from space %', i->>'bene_firstname';
  END LOOP;
  RETURN fpo_data;
END;
$BODY$;

Я получаю следующий вывод для "RETURN fpo_data"

 ["{\"bene_first_name\":{\"value\":\"Chris\"},\"bene_last_name\":{\"value\":\"Ronald\"}}",
  "{\"bene_first_name\":{\"value\":\"John\"},\"bene_last_name\":{\"value\":\"Wick\"}}",
   "{\"bene_first_name\":{\"value\":\"James\"},\"bene_last_name\":{\"value\":\"Cooper\"}}"

Если я пытаюсь напечатать 'bene_firstname' вот так

 RAISE NOTICE 'output from space %', i->>'bene_firstname'

Я получаю ошибку как

 ERROR: operator does not exist: record ->> unknown.

Если я печатаю только «i», я получаю следующие данные, напечатанные в консоли

NOTICE:  output from space ("""{\\""bene_first_name\\"":{\\""value\\"":\\""Chris90\\""},\\""bene_last_name\\"":{\\""value\\"":\\""Ronald\\""}}""")
NOTICE:  output from space ("""{\\""bene_first_name\\"":{\\""value\\"":\\""John\\""},\\""bene_last_name\\"":{\\""value\\"":\\""Wick\\""}}""")
NOTICE:  output from space ("""{\\""bene_first_name\\"":{\\""value\\"":\\""James\\""},\\""bene_last_name\\"":{\\""value\\"":\\""Cooper\\""}}""")

Как я могу получить 'bene_firstname' из вышеуказанного json массива

1 Ответ

0 голосов
/ 27 января 2020

Это то, что вы ищете:

CREATE OR REPLACE FUNCTION file_compare()
RETURNS TEXT LANGUAGE plpgsql COST 100 STABLE AS $BODY$
DECLARE
  fpo_data jsonb;
  i JSONB;
BEGIN
  SELECT json_agg(fo_data)::jsonb from (select fo_data from fpo limit 100) d into fpo_data;
  FOR i IN SELECT * FROM jsonb_array_elements(fpo_data) LOOP
    RAISE NOTICE 'output from space %', i#>>'{bene_first_name,value}';
  END LOOP;
  RETURN fpo_data::text;
END;
$BODY$;

Предполагается, что fo_data является полем json. Обратите внимание, что я изменил функцию на STABLE, так как она не меняет никаких данных.

С уважением,
Bjarni

...