Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/facebook/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 函数参数中允许变量未知_Postgresql - Fatal编程技术网

Postgresql 函数参数中允许变量未知

Postgresql 函数参数中允许变量未知,postgresql,Postgresql,我想创建一个小的助手函数,它允许我停止重复此代码100次: SELECT jsonb_strip_nulls( jsonb_build_object( 'hello', 'world', 'value', 5, 'error', null ) ); -- returns {"hello": "world","value":5} 但是,当我尝试将其包装到函数中时,会出现错误,因

我想创建一个小的助手函数,它允许我停止重复此代码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_对象可以很好地处理非显式类型的字符串文本,因此我假设有一个函数装饰器允许我执行相同的操作?

没有理由使用伪类型
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_对象
调用,还是属性名?在后一种情况下,使用一个只需传递属性值的非变量函数可能更有意义。