允许函数参数中的可变参数未知数



我想创建一个小的辅助函数,让我停止重复这段代码 100 次:

SELECT
jsonb_strip_nulls(
jsonb_build_object(
'hello', 'world',
'value', 5,
'error', null
)
);
-- returns {"hello": "world","value":5}

但是,当我尝试将其包装在函数中时,我会收到错误,因为字符串文字在技术上是未知的:

CREATE OR REPLACE FUNCTION jsonb_build_nullless_object(VARIADIC anyarray) RETURNS jsonb AS $$
SELECT
jsonb_strip_nulls(
jsonb_build_object(
VARIADIC $1
)
)
$$ LANGUAGE sql IMMUTABLE;
SELECT jsonb_build_nullless_object(
'hello', 'world',
'value', 5,
'error', null
);
-- ERROR:  invalid input syntax for integer: "hello" has type unknown

由于纯jsonb_build_object可以很好地处理未显式类型的字符串文字,因此我认为有一个函数装饰器可以让我做同样的事情?

没有理由使用伪类型anyarray,因为参数始终是文本:

CREATE OR REPLACE FUNCTION jsonb_build_nullless_object(VARIADIC text[])
...

Db<>小提琴。

请注意,奇数位置上的参数是文本,因此必须text[]整个参数数组。与某些内置函数(如jsonb_build_object(VARIADIC "any")(相反,SQL 函数不能具有"any"类型的参数。

最新更新