次のような関数が必要です
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} 匹のサルがいます';