【发布时间】:2020-01-30 13:04:45
【问题描述】:
CREATE OR REPLACE FUNCTION file_compare()
RETURNS text LANGUAGE 'plpgsql'
COST 100 VOLATILE AS $BODY$
DECLARE
filedata text[];
fpo_data jsonb;
inddata jsonb;
f_cardholderid text;
f_call_receipt text;
i INT;
BEGIN
SELECT json_agg((fpdata))::jsonb
FROM (SELECT fo_data AS fpdata
FROM fpo
LIMIT 100
) t INTO fpo_data;
i=0;
FOR inddata IN SELECT * FROM jsonb_array_elements(fpo_data) LOOP
f_cardholderid := (inddata->>0)::JSONB->'cardholder_id'->>'value';
f_call_receipt := (inddata->>0)::JSONB->'call_receipt_date'->>'value';
f_primary_key := f_cardholderid || f_auth_clm_number;
filedata[i] := jsonb_build_object(
'fc_primary_key',f_primary_key
);
i := i+1;
END LOOP;
RAISE NOTICE 'PRINTING DATA %', filedata;
END;
$BODY$;
我得到如下文件数据
NOTICE: PRINTING DATA ={"{\"fc_primary_key\": \"A1234567892017/06/27\"}","{\"fc_primary_key\": \"A1234567892017/06/27\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892017/08/07\"}","{\"fc_primary_key\": \"A1234567892024/03/01\"}","{\"fc_primary_key\": \"A12345678945353\"}","{\"fc_primary_key\": \"A1234567892023/11/22\"}","{\"fc_primary_key\": \"A12345678945252\"}","{\"fc_primary_key\": \"A1234567892017-07-01\"}"}
现在我想迭代这个文件数据并获取每个 fc_primary_key 值并检查它在整个 json 数据中出现的次数
注意:每个 fc_primary_key 必须仅使用其后面的值进行验证。它不应与之前的 fc_primary 键进行比较。
例如,如果我检查第三个元素“A1234567892017/08/07”,它在其位置之后出现了 4 次。所以计数必须是 4。
第七个元素中存在相同的“A1234567892017/08/07”,但在第七个位置之后不再有“A1234567892017/08/07”。所以计数必须为零“0”
如何循环数据并获取计数,因为我是 postgres 的新手,我无法找到解决方案。请帮忙!!
【问题讨论】:
标签: postgresql stored-procedures plpgsql postgresql-9.5 stored-functions