如何解决聚合函数作为元组参数postgres
我想使用元组将诸如min,max等的聚合函数作为查询参数传递。
以下是我的查询:
"select $5(CAST (vol AS FLOAT)) AS agg_v,"
+ "time_bucket_gapfill" + "(($1::text || ' minutes')::interval,t) AS time_function_minute,"
+ "tag_id from rtdata "
+ "where tag_id = any($2) and t > $3 and t < $4 "
+ "GROUP BY (tag_id,time_function_minute) ORDER BY time_function_minute"
但是我遇到以下异常:
io.vertx.pgclient.PgException:附近或附近的语法错误 “(” 在io.vertx.pgclient.impl.codec.ErrorResponse.toException(ErrorResponse.java:29) 在io.vertx.pgclient.impl.codec.PrepareStatementCommandCodec.handleErrorResponse(PrepareStatementCommandCodec.java:62) 在io.vertx.pgclient.impl.codec.PgDecoder.decodeError(PgDecoder.java:233) 在io.vertx.pgclient.impl.codec.PgDecoder.decodeMessage(PgDecoder.java:122) 在io.vertx.pgclient.impl.codec.PgDecoder.channelRead(PgDecoder.java:102) 在io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:253) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) 在io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:352) 在io.netty.channel.DefaultChannelPipeline $ HeadContext.channelRead(DefaultChannelPipeline.java:1422) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:374) 在io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:360) 在io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:931) 在io.netty.channel.nio.AbstractNioByteChannel $ NioByteUnsafe.read(AbstractNioByteChannel.java:163) 在io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:700) 在io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:635) 在io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:552) 在io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:514) 在io.netty.util.concurrent.SingleThreadEventExecutor $ 6.run(SingleThreadEventExecutor.java:1044) 在io.netty.util.internal.ThreadExecutorMap $ 2.run(ThreadExecutorMap.java:74) 在io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) 在java.lang.Thread.run(Thread.java:745)
但是,如果我将$ 5替换为硬代码聚合函数,它将起作用。在这种情况下如何动态传递聚合函数?
RxJava代码段:
return txBegin()
.flatMapObservable(tx ->
tx.rxPrepare(abovesql)
.flatMapObservable(pq -> {
return pq.createStream(50,Tuple.of(
evalBucketInterval(req),req.getTags().toArray(new Integer[0]),parse(req.getStartDate()),parse(req.getEndDate()),parse(req.getAggFunc())))
.toObservable();
})
.doAfterTerminate(tx::commit))
.map(this::toFuncJson);
解决方法
PostgreSQL仅允许将参数用作值,并且在尝试将参数用作函数名,表名等时不理解。因此,您不能将集合名作为参数传递。
我建议在您的应用程序中通过串联包含聚合函数名称的字符串值来解决此问题。我猜可能是这样,但是我不确定确切的语法以及您的环境有哪些限制:
"select "+ my_agg_func_name +"(CAST (vol AS FLOAT)) AS agg_v,"
+ "time_bucket_gapfill" + "(($1::text || ' minutes')::interval,t) AS time_function_minute,"
+ "tag_id from rtdata "
+ "where tag_id = any($2) and t > $3 and t < $4 "
+ "GROUP BY (tag_id,time_function_minute) ORDER BY time_function_minute"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。