有没有办法让PostgreSQL中的函数返回任意类型?
我正在尝试使用PLV8来获取和比较PostgreSQL 9.2中JSON类型的字段。
以下是工作原理:
CREATE or replace FUNCTION jn (j json, key any ) RETURNS numeric
LANGUAGE plv8
IMMUTABLE
AS $function$
var ej = JSON.parse(j);
if (typeof ej != 'object') return NULL;
return JSON.stringify(ej[key]);
$function$;
SELECT * FROM things WHERE jn(data,'count') <= '10';返回其中count字段为<= 10。但是,如果该字段不是数字,则返回失败。我不想为我的json可能保存的每一种类型的数据创建一个特定的函数,有没有办法以某种方式推断数据类型并进行隐式转换?
另请参阅How do I query using fields inside the new PostgreSQL JSON datatype?
发布于 2012-05-13 20:46:40
您似乎在寻找使用Polymorphic types的函数。
请阅读上面关于类型的部分和this section中的最后两个示例。
请注意,key参数的类型和函数的输出类型应该匹配。如果不是这样,那么您可能应该返回text,然后在函数外部将其强制转换为正确的类型。
我认为这将为您做好这项工作:
CREATE or replace FUNCTION jn (j json, key anyelement ) RETURNS anyelement
LANGUAGE plv8
IMMUTABLE
AS $function$
var ej = JSON.parse(j);
if (typeof ej != 'object') return NULL;
return JSON.stringify(ej[key]);
$function$;对不起,我没有9.2服务器,所以我不能测试它。
编辑:
事情是这样的-在你能够在函数中执行任何类型转换之前,必须先创建它。在创建时,函数的输入参数的类型和返回类型是固定的。这意味着您只有两种可能性:
anyelement类型,这将强制您具有与您希望从text类型返回的类型相同的参数类型,并将结果强制转换到函数外部。由于PLV8还不支持anyelement类型,您实际上可以在PL/pgSQL上创建一个包装器函数来为您完成此工作:
CREATE FUNCTION jn_wrap(jn varchar, key anyelement, OUT ret anyelement)
AS $js_wrap$
BEGIN
EXECUTE 'SELECT CAST(jn($1, $2) AS '||pg_typeof(key)||')'
USING jn, key INTO ret;
RETURN ;
END;
$js_wrap$ LANGUAGE plpgsql;虽然我认为这可能是非常典型的,但key的类型将与所需的返回类型不同。
https://stackoverflow.com/questions/10571741
复制相似问题