0

次の場合、integer[] を反復処理するにはどうすればよいです
operators_ids = string_to_array(operators_ids_g,',')::integer[];
operators_ids
私はこのようにそれを行うことはできません:
FOR oid IN operators_ids LOOP
そしてこれ:
FOR oid IN SELECT operators_ids LOOP
oidですinteger;

4

2 に答える 2

1

次のように配列を反復処理できます

DO
$body$
DECLARE your_array integer[] := '{1, 2, 3}'::integer[];
BEGIN
    FOR i IN array_lower(your_array, 1) .. array_upper(your_array, 1)
    LOOP

    -- do something with your value
    raise notice '%', your_array[i];

    END LOOP;
END;
$body$
LANGUAGE plpgsql;

しかし、私の見解では、主な問題は次のとおりです。なぜこれを行う必要があるのですか? より良い方法で問題を解決できる可能性があります。たとえば、次のようになります。

DO
$body$
DECLARE i record;
BEGIN
    FOR i IN (SELECT operators_id FROM your_table)
    LOOP

    -- do something with your value
    raise notice '%', i.operators_id;

    END LOOP;
END;
$body$
LANGUAGE plpgsql;
于 2012-12-18T12:05:41.047 に答える
0

私はDezsoが正しいと思います。インデックスを使用して配列をループする必要はありません。制限 1 と組み合わせて person_id でグループ化する select ステートメントを作成すると、必要な結果セットが得られます。

create or replace function statement_example(p_data text[]) returns int as $$
declare
 rw event_log%rowtype;
begin
  for rw in select * from "PRD".events_log where (event_type_id = 100 or event_type_id = 101) and person_id = any(operators_id::int[]) and plc_time < begin_date_g order by plc_time desc group by person_id limit 1 loop
  raise notice 'interesting log: %', rw.field;
  end loop;
  return 1;
end;
$$ language plpgsql volatile;

それははるかに優れたパフォーマンスを発揮するはずです。それでも整数配列をループすることを好み、多くの person_id を管理する必要がある場合は、flyweight デザイン パターンの使用を検討してください。

create or replace function flyweight_example(p_data text[]) returns int as $$
declare
 i_id int;
 i_min int;
 i_max int;
begin
 i_min := array_lower(p_data,1);
 i_max := array_upper(p_data,1);
 for i_id in i_min .. i_max loop
  raise notice 'interesting log: %',p_data[i_id];
 end loop;
 return 1;
end;
$$ language plpgsql volatile;
于 2012-12-18T19:05:46.503 に答える