聚合函数作为元组参数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"

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...