我对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;
}
答案 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;