我有以下SQL查询:
query_string = "SELECT sum(unmatched), " \
"TIMESTAMP WITH TIME ZONE 'epoch' + INTERVAL '1 second' * " \
"round(extract('epoch' from time_window) / {}) * {} as time_window " \
"FROM aggregate_counts WHERE reconciliation_name = %s " \
"GROUP BY round(extract('epoch' from time_window) / {})".format(interval_sec, interval_sec, interval_sec)
cur.execute(query_string, (reconciliation_name))它可以正常工作,除非我想避免使用字符串替换"interval_sec“,而是使用位置参数,就像对其他参数一样。问题是,如果我这么做:
query_string = "SELECT sum(unmatched), " \
"TIMESTAMP WITH TIME ZONE 'epoch' + INTERVAL '1 second' * " \
"round(extract('epoch' from time_window) / %s) * %s as time_window " \
"FROM aggregate_counts WHERE reconciliation_name = %s " \
"GROUP BY round(extract('epoch' from time_window) / %s)"
cur.execute(query_string, (interval_sec, interval_sec, reconciliation_name, interval_sec))我得到以下错误:
错误处理中间件发现了以下异常:{'S':' Error ','V':'ERROR','C':'42803','M':‘aggregate_counts.time_window’列必须出现在GROUP子句中,或者用于聚合函数'P':'177','F':‘解析_agg.c’,'L':'1344','R':'check_ungrouped_columns_walker'} 文件文件“ps 8000/core.py”,第1829行,在execute ps= cache'ps‘KeyError中:(“选择sum(不匹配的),时间戳带时区'epoch’+间隔‘1秒’*圆形(从time_window提取(‘epoch’)/‘%s’)* %s作为time_window从aggregate_counts ( reconciliation_name =%s组(从time_window提取(‘epoch’)/ %s)",((701,1,),(701,1),(701,1),(705,0,.text_out at 0x10c58cea0>))
位置参数能否仅用于比较(=,>=,
发布于 2019-03-22 20:34:28
所以这基本上是不可能的。原因是select子句中的%s将被转换为$x位置参数,而group by中的%s将被转换为$y (x和y是各自的位置)。现在,postgres没有办法知道,在解决后,这两者将是相同的。因此它假设"aggregate_counts.time_window“不存在于GROUP中。我知道这不是一个完美的解释,但这是正在发生的事情。
https://stackoverflow.com/questions/55301313
复制相似问题