簡體   English   中英

在存儲過程 Postgres 中通過 JSON 數據循環

[英]LOOP through JSON data in stored procedure Postgres

我的 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”的所有數據推送到單個 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'

這是你想要的:

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,因為它不會更改任何數據。

此致,
比亞尼

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM