我正试图将Athena参数化查询功能与CTE结合使用。
如果我像这样运行一个简单的Athena CTE select语句,我不会得到任何结果,即使我应该得到一个值为1
:的单行
aws athena start-query-execution
--query-string "WITH cte as (select 1 where 1 = ?) select * from cte where 2 = ?"
--query-execution-context "Database"="default"
--result-configuration "OutputLocation"="s3://athena-test-bucket/"
--execution-parameters "1" "2"
# Output CSV:
# "_col0"
奇怪的是,如果我反转参数,查询就会正常工作:
aws athena start-query-execution
--query-string "WITH cte as (select 1 where 1 = ?) select * from cte where 2 = ?"
--query-execution-context "Database"="default"
--result-configuration "OutputLocation"="s3://athena-test-bucket/"
--execution-parameters "2" "1"
# Output CSV:
# "_col0"
# "1"
AWS文件指出:
在参数化查询中,参数是位置性的,用?表示?。参数在查询中按顺序分配值。不支持命名参数。
但事实显然并非如此,因为只有当参数的顺序相反时,查询才会按预期运行。
我如何让Athena以标准的、从前到后的位置方式正确插入参数,这是其他DB的典型方式?虽然上面的例子很简单,但在现实中,我有带有任意数量参数的任意嵌套CTE的查询。
这是旧版本的Presto(链接1,链接2(和Trino(链接(中已知的问题(使用WITH
子句准备的语句的参数顺序不正确(,已修复。对于版本0.272中的Presto(修复PR(:
使用WITH子句修复已准备语句查询的参数排序。
遗憾的是,在编写Athena引擎版本2时,它是基于Presto 0.217的,因此您需要通过更改参数顺序来解决问题。
UPD
应该在基于Trino的Athena v3引擎中工作。