Postgres如何创建在查询中使用的函数

时间:2016-02-04 18:08:56

标签: java postgresql postgresql-9.3 postgresql-9.4

我对postgres比较新,使用的是9.4版本。我有一个简单的Java函数,如果我让postgres这样做,我被告知会更有效率。我的函数接受来自数据库的Integer和String数据并对它们进行转换。这是我的函数:注意它需要一个整数和一个字符串

private static String difference(Integer i,String created_on) {
    String id = "";
    if (i < 60) {
      ...
        }
        else if (i >= 60 && i < 1440) {

       ....
    } 
else if (i >= 1440 && i < 10080) {

      ....

    } 
    else {

      ....
    }

    return id;
}

这是我的查询,现在Created_on是String,last_reply是Integer

"SELECT created_on as created_on,
last_reply as last_reply;

一旦数据来自数据库,我就把它放在一个循环中并通过这样做来转换它:

  for(i=0;i<10;i++) 
      {
                jo = new JSONObject();
                jo.put("last_reply", difference(rs.getInt("last_reply",
                                    rs.getString("created_on"))));
            }

正如您所见,数据转换发生在这里

差(rs.getInt(&#34; last_reply&#34 ;,                                         rs.getString(&#34; created_on&#34)

我现在的问题是如何复制该功能并将其保存在postgres中,这样我就可以进行这样的查询

**

**"SELECT difference(last_reply,created_on) as newvalue, created_on as created_on,
    last_reply as last_reply;**

** 据我所知,从性能角度来看,最好让数据库执行此操作,而不是使用Java循环数据。任何建议都会很棒......

更新

该功能用于社交应用程序,用于衡量以分钟为单位发布内容的时间。如果它少于60分钟,那么它将返回类似&#34; 6分钟前等等#34;如果它在60-1440之间,那么它将返回&#34; 4小时前等。&#34; 。我已经在If-else语句中计算了计算但没有包含它,以便代码看起来更具代表性。

以下是完整的方法

private static String difference(Integer i,String created_on) {
    String id = "";
    if (i < 60) {

        if(i<1)
            id = "Now";

        else
            id = i + " min";
        }
        else if (i >= 60 && i < 1440) {

        i=(i/60);
        if(i==0)
        {i=1;}
        id = i + " hrs";
    } else if (i >= 1440 && i < 10080) {

        i=(i/1440);
        id = i + " day(s)";

    }
    else {
  // Posted longer than 7 days so Created_On will show date created
 // Passed down to the id String
        id = created_on;

    }

    return id;
}

1 个答案:

答案 0 :(得分:2)

不确定Java差异函数的数据类型是什么,但您可以通过以下两种方式之一来完成。将数据集从Postgres中拉入Java,并通过将两个值传递给函数来找到差异,然后将该结果集用于任何目的。

另一种方法是直接在Postgres中创建一个函数,然后从查询中调用该函数。

创建功能:

CREATE FUNCTION intDifference(integer, integer) RETURNS integer
    AS 'select $2 - $1;'
    LANGUAGE SQL
    IMMUTABLE
    RETURNS NULL ON NULL INPUT;

在查询中使用函数:

SELECT intDifference(last_reply,created_on) as newvalue, created_on as created_on, last_reply as last_reply
FROM SOME_TABLE;