0

メーリングリストhttp://archives.postgresql.org/pgsql-hackers/2005-06/msg01481.phpでこのエントリを読んだことがあります

SELECT *
FROM foo_func(
    c => current_timestamp::timestamp with time zone,
    a => 2,
    b => 5
);

ここで、連想配列の引数を関数に渡すことができるこの種のソリューションが必要です。ダミーテーブルを作成し、そのテーブルを引数タイプとして使用する必要がありますか?またはこれに対する簡単な修正はありますか?または、このハックは実装されていますか?

または、pl / pythonを使用して同じものをエミュレートできますか?

4

2 に答える 2

2

これはバージョン 9.0で実装されています。

4.3.2. 名前表記の使用

名前付き表記法では、各引数の名前は := を使用して指定され、引数式から分離されます。例えば:

SELECT concat_lower_or_upper(a := 'Hello', b := 'World');
 concat_lower_or_upper 
-----------------------
 hello world
(1 row)
于 2012-04-08T08:49:49.873 に答える
2

debian の hstore と PG-8.4 を使用した回答の手順は次のとおりです。

1) まだインストールされていない場合は、contrib パッケージをインストールします

# apt-get install postgresql-contrib-8.4

2) 関連するデータベースに hstore をインストールします。

$ psql -U postgres -d データベース名
# \i /usr/share/postgresql/8.4/contrib/hstore.sql

2bis) plpgsql 言語がインストールされていない場合は、インストールします (まだ psql 内で postgres ユーザーとして)

# 言語の作成 plpgsql;

3) hstore を入力として受け取る関数を作成します。キーと値を列挙するだけの plpgsql の例を次に示します。

CREATE OR REPLACE function enum_hstore(in_h hstore) returns void
as $$
declare
  kv record;
begin
  for kv in select * from (select (each(in_h)).*) as f(k,v) loop
    raise notice 'key=%,value=%',kv.k,kv.v;
  end loop;
end
$$ language plpgsql;

4) 関数を呼び出します。キーと値はテキスト型であるため、質問の current_timestamp 呼び出しのように、非リテラル エントリをテキストにキャストする必要がある場合があります。例:

  select enum_hstore(
    hstore('c',current_timestamp::text) ||
    'a=>2,b=>5'::hstore
  );

上記の関数から期待される結果:

注意: キー=a、値=2
 注意: キー=b、値=5
 注意: キー = c、値 = 2012-04-08 16:12:59.410056+02
于 2012-04-08T14:17:02.640 に答える