Получить данные с помощью динамических c ключей в postgres - PullRequest
0 голосов
/ 18 февраля 2020

Это мой 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$;
...