Это мой fpo_data
вывод
[{"f1": 1, "f2": "\"{\\\"first_name\\\":{\\\"value\\\":\\\"Agnes\\\"},\\\"last_name\\\":{\\\"value\\\":\\\"Strohmeyer\\\"}}\""},
{"f1": 2, "f2": "\"{\\\"first_name\\\":{\\\"value\\\":\\\"John\\\"},\\\"last_name\\\":{\\\"value\\\":\\\"Watson\\\"}}\""}]
Это мой column_names
вывод
[{"f1": "first_name", "f2": "First Name"}, {"f1": "last_name", "f2": "Last Name"}]
Я зацикливаю данные fpo_data и получаю каждое значение, т.е. first_name
и last_name
здесь, для которого я написал следующую логику c
FOR inddata IN SELECT * FROM jsonb_array_elements(fpo_data) LOOP
fcdata1 := inddata->>'f2';
fc_data1 := fcdata1::JSONB;
fc_data1 := (fc_data1->>0)::JSONB;
pkey = fc_data1->'first_name'->>'value';
END LOOP;
Здесь я упомянул только 2 поля first_name
и last_name
, тогда как на самом деле есть около 40 полей, и я не могу написать 40 строк кода каждый раз. Чтобы избавиться от этого, я использую таблицу fc_tables
с именем поля. Я получаю эти данные в column_names
Я пытаюсь l oop this column_names
и динамически передать имя поля в эту строку
pkey = fc_data1->'first_name'->>'value';
Для которого я написал это
f_name := coldata->>'f1'
pkey = fc_data1->f_name->>'value';
Я получаю синтаксическую ошибку. Как передать динамические c ключи, как указано выше, помогите !!
Ниже представлена моя хранимая процедура
CREATE OR REPLACE FUNCTION public.file_compare(
p_universe_name character varying,
p_doc_guid uuid,
p_compare_doc_guid uuid,
tb_name text,
compare_tb_name text)
RETURNS text
LANGUAGE 'plpgsql'
COST 100
VOLATILE
AS $BODY$
DECLARE
inddata jsonb;
pkey text;
fid INTEGER;
fcdata1 text;
fc_data1 jsonb;
fpo_data jsonb;
column_names jsonb;
col_name text;
f_name text;
coldata jsonb;
BEGIN
EXECUTE 'SELECT json_agg((fid, fpdata))::jsonb
FROM (SELECT id as fid, fpo_data AS fpdata
FROM '||tb_name||'_pk
ORDER BY id
OFFSET 10
LIMIT 1000
) t' INTO fpo_data;
EXECUTE 'SELECT json_agg((internal_column_name, column_name))::jsonb
FROM (SELECT internal_column_name AS internal_column_name, column_name as column_name
FROM public.fc_tables
WHERE table_name ='''|| p_universe_name || '''
ORDER BY column_name
) t' INTO column_names;
RAISE NOTICE 'FILE ONE DATA %', column_names;
FOR inddata IN SELECT * FROM jsonb_array_elements(fpo_data) LOOP
fid := inddata->>'f1';
fcdata1 := inddata->>'f2';
fc_data1 := fcdata1::JSONB;
fc_data1 := (fc_data1->>0)::JSONB;
FOR coldata IN SELECT * FROM jsonb_array_elements(column_names) LOOP
f_name := coldata->>'f1';
pkey = fc_data1->f_name->>'value';
END LOOP;
END LOOP;
END;
$BODY$;