创建concat_ws

时间:2019-01-25 20:57:45

标签: postgresql function concat concat-ws

This blog post显示了如何在Pg中创建immutable_concat函数的示例:

CREATE OR REPLACE FUNCTION immutable_concat(VARIADIC "any")
  RETURNS text AS 'text_concat'
  LANGUAGE internal IMMUTABLE

我想对concat_ws进行同样的操作,并且确实存在相应的text_concat_ws,但是,以下操作会使该过程崩溃:

CREATE OR REPLACE FUNCTION immutable_concat_ws(VARIADIC "any")
  RETURNS text AS 'text_concat_ws'
  LANGUAGE internal IMMUTABLE

更新:immutable_concat_ws的名称应为(glue, *parts),一种胶水(文本或varchar)和一个或多个部分(文本,varchar或null)。

我在这里想念什么?

2 个答案:

答案 0 :(得分:1)

好的,因此您正在映射到内部的“ C”函数,我必须承认我从来没有做过自己。

但是,text_concat_ws是带分隔符的,因此它不只是带有可变参数的文本参数列表,还包括takes a separator THEN the variadic list of text个参数。相应地调整函数定义。

如果要这样做,您可能希望将调试器挂接到后端,或者在可行的情况下以单个进程运行它。

也-我刚找到PostgreSQL源代码的doxygen接口来回答您的问题。谢谢:-)

答案 1 :(得分:1)

首先,该函数在定义中需要两个参数,就像Richard已经建议的那样,并且您相应地更新了问题。

第二,您可以使用"any"通过LANGUAGE internal输入创建该函数。不过,这并不意味着您应该这样做。

concat_ws()仅是STABLE,这是有原因的。其中datetimestamp的文本表示取决于语言环境/日期样式设置,因此结果不是不可变。基于此的索引可能会无提示地中断。限于text输入,可以安全地声明为IMMUTABLE。 由于您只需要text输入(或varchar,其隐式转换为text),因此请限制在您的用例中,并且是安全的:

CREATE OR REPLACE FUNCTION immutable_concat_ws(text, VARIADIC text[])
RETURNS text AS 'text_concat_ws' LANGUAGE internal IMMUTABLE;

抵制这样做immutable_concat_ws('|', now()::text, 'foo')的诱惑。这将重新引入呼叫中的所述依赖性。

相关: