通过存储过程Postgres中的JSON数据进行遍历

问题描述 投票:1回答:1

我创建了一个如下的存储过程,并且我试图将特定列“ fo_data”的所有数据推入单个JSON变量,并且我试图循环获得的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\\""}}""")

如何从上述json数组中获取'bene_firstname'

sql postgresql stored-procedures plpgsql postgresql-9.5
1个回答
0
投票

这是您要寻找的内容:

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 fpo limit 100 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$;

最好的问候,Bjarni

© www.soinside.com 2019 - 2024. All rights reserved.