2

次のような関数が必要です

SELECT vformat('Hello %%! Bye %%...', array['John','Maria'], '%%');
-- 'Hello John! Bye Maria...'

文字列にプレースホルダー (テンプレート) を指定し、対応する入力をベクターに入力すると、テキストが返されます。「プレースホルダ マーク」は自由文字列です。

pg9.1 形式 (sprintf など) 関数は使用できません。これは、'%' 以外のマークを使用できず (例: Python formatterを参照)、配列パラメーターを使用できないため (例: vsprintfを参照)。PostgreSQL 9.0(8.4+だと思います)での最も簡単なソリューションは

CREATE FUNCTION array_zipper_string(anyarray,anyarray) RETURNS text AS $$ 
  -- use with bigger array at left
  SELECT string_agg(t.val||coalesce($2[t.idx],''),'')  
  FROM  (SELECT generate_subscripts($1, 1) AS idx, unnest($1) AS val) AS t;
$$ LANGUAGE SQL IMMUTABLE;

CREATE FUNCTION tpl_positional(text,anyarray,varchar DEFAULT '%%') 
RETURNS text AS $$ 
  SELECT array_zipper_string(string_to_array($1,$3),$2);
$$ LANGUAGE SQL IMMUTABLE;
CREATE FUNCTION tpl_positional(
   text, text, varchar DEFAULT '%%',varchar DEFAULT '|' 
) RETURNS text AS $$ 
  SELECT tpl_positional($1,string_to_array($2,$4),$3);
$$ LANGUAGE SQL IMMUTABLE;

-- TESTING:
SELECT tpl_positional('Hello %%! Bye %%...', 'John|Maria');
SELECT tpl_positional('Hello %%!',array['John']);

同じことを行うためのよく知られた(オープンソースの)関数またはライブラリがありますか?

PS:これとそれ以上のことを行います(!)...私の願い事リスト:

  • 標準ライブラリからのオープンソース
  • インデックス可能なプレースホルダーのオプション、'Hello %%{1}! さようなら %%{2}...'
  • フォーマッタを使用するオプション、'There are %%2d monkeys.' または '%%{1|2d} 匹のサルがいます';
4

3 に答える 3

2

Python の書式設定関数が必要な機能を実行する場合は、PL/Python でラップして、それを使用します。次のことを行う必要があります。

CREATE LANGUAGE plpythonu;

--with-python... Pg のインストール方法や使用しているパッケージによっては、python 言語サポートを含む追加のパッケージをインストールするか、 を使用して再コンパイルする必要がある場合があります。Fedora 17パッケージを使用している私にとってはyum install postgresql-plpython.

次のような署名が必要です。

CREATE OR REPLACE FUNCTION my_format(formatstr text, placeholder text, args VARIADIC text) RETURNS text LANGUAGE 'plpythonu' IMMUTABLE AS $$
 .... body here ....
 $$;

plpython使用法uに注意してください。ここでuは「信頼されていない」、つまり「セキュリティ モデルがない」ことを意味します。信頼できない言語で実行されるコードは制限できないため、サーバーはスーパーユーザーがそのような言語で関数を作成することのみを許可します。データベースが信頼性の低いユーザーに公開された場合に、作成者が意図した以外のことを行うようにだまされないように、それらを作成する必要があります。

残念なことに、手続き型言語の配列の処理は、最後に確認したところ、それほど素晴らしいものではありませんでした。この投稿の下部にある depesz の記事とそのコメントを参照してください。それはうまくいきますが、うまくいくよりも不器用です。

Python のフォーマット機能で期待どおりの結果が得られない場合は、Perl を検討してください。PL/Perl は非常に人気があります。その理由の 1 つは、Python とは異なり、セキュリティ モデルがあり、「信頼できる」バージョンのplperl. あなたが望むことを行うのに適した CPAN モジュールが見つからない場合、私は非常に驚かれることでしょう。関数のシグネチャはほぼ同じで、plperl.

plperl と sprintf に関するこの通常どおりの depesz の優れた記事を参照してください。

于 2012-09-03T22:55:32.523 に答える
1

他の可能性はorafce http://postgres.cz/wiki/Oracle_functionality_%28en%29を使用することです- スキーマ ''PLVsubst'' からの関数はあなたが望むことを正確に行います。Orafce は redhat、centos リポジトリにありますが、通常はどのホスティングでも有効になっていません。

于 2012-09-04T05:14:33.227 に答える