PostgreSQL占位符模板

PostgreSQL占位符模板,postgresql,formatting,Postgresql,Formatting,我需要一个函数,比如 选择vformat'Hello%%!再见%%…',数组['John','Maria'],'%'; -“你好,约翰!再见,玛丽亚……” 将带有占位符的字符串提供给模板,并将相应的输入提供给向量,它将返回文本。占位符标记是一个自由字符串 我不能像sprintf函数那样使用pg9.1格式,因为它不允许“%”以外的其他标记参见ex.并且不允许数组参数参见ex。 PostgreSQL 9.0最简单的解决方案是 创建函数数组\u zippers\u stringanyarray,any

我需要一个函数,比如

选择vformat'Hello%%!再见%%…',数组['John','Maria'],'%'; -“你好,约翰!再见,玛丽亚……” 将带有占位符的字符串提供给模板,并将相应的输入提供给向量,它将返回文本。占位符标记是一个自由字符串

我不能像sprintf函数那样使用pg9.1格式,因为它不允许“%”以外的其他标记参见ex.并且不允许数组参数参见ex。 PostgreSQL 9.0最简单的解决方案是

创建函数数组\u zippers\u stringanyarray,anyarray以$$形式返回文本 -与左侧较大的阵列一起使用 选择字符串_aggt.val | | coalesce$2[t.idx],, 从中选择generate_subscripts$1,1作为idx,unnest$1作为val作为t; $$语言SQL不可变; 创建函数tpl_positionText、anyarray、varchar默认值“%” 以$$形式返回文本 选择数组\u拉链\u字符串\u到\u数组$1、$3、$2; $$语言SQL不可变; 创建功能tpl_位置 text,text,varchar默认值“%”,varchar默认值“|” 以$$形式返回文本 选择tpl_位置$1,字符串_到_数组$2,$4,$3; $$语言SQL不可变; -测试: 选择tpl_位置“Hello%%”!再见%%…',“约翰|玛丽亚”; 选择tpl_位置“Hello%%!”,数组['John']; 有众所周知的开源函数或库可以做同样的事情吗

附言:这样做,还有更多的事情。。。我的愿望清单:

来自标准库的开源 可索引占位符的选项,'Hello%%{1}!再见%{2} 使用格式化程序的选项,“有%%2d猴子。”或“有%%{1|2d}猴子”;
如果Python的格式化函数满足您的需要,请通过PL/Python包装它,并使用它。您需要:

CREATE LANGUAGE plpythonu;
。。。这可能需要您安装一个包含python语言支持的附加软件包,或者使用-with python重新编译,具体取决于您安装Pg的方式或使用的软件包。对于我来说,使用Fedora17软件包就是yum安装postgresql-plpython

您需要一个签名,如:

CREATE OR REPLACE FUNCTION my_format(formatstr text, placeholder text, args VARIADIC text) RETURNS text LANGUAGE 'plpythonu' IMMUTABLE AS $$
 .... body here ....
 $$;
注意plpythonu的用法。这里u的意思是不可信的(没有安全模型)。无法限制以不受信任的语言运行的代码,因此服务器只允许超级用户使用此类语言创建函数。它们的编写方式必须确保,如果数据库暴露给不太信任的用户,它们不会被欺骗,而不是按照作者的意图进行操作

不幸的是,上一次我检查时,过程语言对数组的处理并不完美。请参阅本文底部的depesz文章及其评论。这是可行的,只是比好的更笨拙

如果Python的格式功能不符合您的要求,请考虑Perl。PL/Perl非常流行,部分原因是与Python不同,它有一个安全模型,并且有一个可信的plperl版本。如果你找不到一个合适的CPAN模块来做你想做的事情,我会非常惊讶。函数签名与plperl几乎相同


请看这一点。

另一种可能性是使用orafce-模式中的函数PLVsubst完全可以满足您的需要。Orafce位于redhat、centos存储库中,但通常在任何主机上都未启用

PostgreSQL FORMAT函数根据格式字符串格式化参数

如果您使用过C编程语言,您会发现FORMAT函数与sprintf函数类似

SELECT FORMAT('Hello, %s','PostgreSQL');

      format
-------------------
 Hello, PostgreSQL
(1 row)

有关详细信息,请参见

Hum。。。非标准PG语言,需要安装额外的软件包。。。好的,这是一种可能,也许不是五月主办的。感谢您记住这里,以及关于特定链接的信息。我将Perl用于其他任务,比如Python。对于最简单的函数,比如上面我的tpl_positional,还有一个问题:当使用PG标准的纯SQL或PL/pgSQL运行时,它们是快速的吗?多少基准测试等效函数?@PeterKrauss PL/Perl和PL/Python是核心服务器的一部分。但是,它们通常由打包程序和分发程序分为可选模块,因此主postgresql包不必依赖Perl和Python。任何体面的主人都会提供plperlu;很多人不会提供不可信的版本,原因很明显。@PeterKrauss我不知道你在问什么。这是你问题的第二部分。您是否在问PLs相对于内置C功能的性能如何?如果是:基准测试并查看,这取决于PL、工作负载、操作系统、Pg版本、Python/perl/etc版本、比较的确切函数等。最好的结果可能是将C格式库包装成PostgreSQL C扩展库,但在托管环境中,您几乎肯定无法做到这一点。您是否指的是函数utl_file.putf,它是一个类似于标准C sprintf的格式化程序。。。另一个?关于putf,与pg9.1格式函数相同;有我已经描述过的问题。附言:postgres.cz网站很棒,我用他的建议解决了很多其他的小问题
pg中的一种可变函数--但我通过函数字符串选择plvsubst.string'我的名字是%s%s',ARRAY['Pavel','Stěhule';PostgreSQL可以进行文字字符串插值吗?例如:name=tomprintfhis name是{name}。