java - Postgres 如何创建一个在查询中使用的函数

标签 java postgresql postgresql-9.3 postgresql-9.4

我对 postgres 比较陌生,正在使用版本 9.4 。我在 Java 中有一个简单的函数,有人告诉我如果让 postgres 来做它会更有效。我的函数接受来自数据库的整数和字符串数据并转换它们。这是我的函数:注意它接受整数和字符串

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 是字符串,last_reply 是整数

"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("last_reply", rs.getString("created_on")

我现在的问题是如何复制该函数并将其保存在 postgres 中,以便我可以执行这样的查询

**

**"SELECT difference(last_reply,created_on) as newvalue, created_on as created_on,
    last_reply as last_reply;**
** 据我所知,从性能的角度来看,最好让数据库来做这件事,而不是使用 Java 循环数据。任何建议都会很棒...

更新

该函数用于社交应用程序,以分钟为单位测量发布内容的时间。如果小于 60 分钟,则它将返回“6 分钟前等”之类的内容,如果在 60-1440 之间,则它将返回“4 小时前等”。 。我已经计算出了 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;
}

最佳答案

不确定 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;

关于java - Postgres 如何创建一个在查询中使用的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35208429/

相关文章:

java - Netty 5.0.0 closeFuture().sync() 从未完成

sql - 如何在 Postgres 中创建一个空的匿名表?

postgresql - 刷新物化 View 时,索引也会自动刷新吗?

django - Sentry 升级错误

sql - 如何从 PL/pgSQL 触发器函数中的变量派生 UPDATE 中的列名?

postgresql - PostgreSQL中的"Abstract"表(继承)

postgresql - postgres 中的 REGEXP_COUNT

java - 为什么 switch 比 if 快

java - 在 Azure 应用服务中访问 Tomcat 和 Webapp 日志

java - 由synchronized关键字标记的关键部分与使用信号量有何不同?