Postgresql 函数参数中允许变量未知
我想创建一个小的助手函数,它允许我停止重复此代码100次:Postgresql 函数参数中允许变量未知,postgresql,Postgresql,我想创建一个小的助手函数,它允许我停止重复此代码100次: SELECT jsonb_strip_nulls( jsonb_build_object( 'hello', 'world', 'value', 5, 'error', null ) ); -- returns {"hello": "world","value":5} 但是,当我尝试将其包装到函数中时,会出现错误,因
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_对象可以很好地处理非显式类型的字符串文本,因此我假设有一个函数装饰器允许我执行相同的操作?没有理由使用伪类型
anyarray
,因为参数始终是文本:
CREATE OR REPLACE FUNCTION jsonb_build_nullless_object(VARIADIC text[])
...
请注意,奇数位置上的参数是文本,因此整个参数数组必须是
text[]
。SQL函数不能有类型为“any”的参数,这与一些内置函数(如jsonb\u build\u object(VARIADIC“any”)
不同,不幸的是,如果生成具有布尔值或数值等的jsonb对象,这不起作用。;仅当所有键都具有文本值时,此选项才有效。我应该说明这一需求,并在OP中更新我的示例以反映这一点。如果我用“value”在DBfiddle中添加一个额外的键值对:5,那么它会破坏多态性。哦,刚刚看到你的after评论;所以听起来我想做的是不可能的;只是jsonb_build_对象中内置了一个不公开可用的异常。是的,您只能在C中创建完全多态的函数作为Postgres扩展。您到底在重复什么100次?只有组合的jsonb_strip_null
+jsonb_build_对象
调用,还是属性名?在后一种情况下,使用一个只需传递属性值的非变量函数可能更有意义。