我想创建一个小的辅助函数,让我停止重复这段代码 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"类型的参数。