首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回任意类型的PostgreSQL函数

返回任意类型的PostgreSQL函数
EN

Stack Overflow用户
提问于 2012-05-13 20:31:50
回答 1查看 5K关注 0票数 3

有没有办法让PostgreSQL中的函数返回任意类型?

我正在尝试使用PLV8来获取和比较PostgreSQL 9.2中JSON类型的字段。

以下是工作原理:

代码语言:javascript
复制
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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-05-13 20:46:40

您似乎在寻找使用Polymorphic types的函数。

请阅读上面关于类型的部分和this section中的最后两个示例。

请注意,key参数的类型和函数的输出类型应该匹配。如果不是这样,那么您可能应该返回text,然后在函数外部将其强制转换为正确的类型。

我认为这将为您做好这项工作:

代码语言:javascript
复制
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上创建一个包装器函数来为您完成此工作:

代码语言:javascript
复制
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的类型将与所需的返回类型不同。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10571741

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档