我正在尝试检查某个字段是否位于选择查询的数组中。这是我想要提出的查询:
select item_id, name, desc from item_table where contains(array[24805247, 2156654], item_id);
适用于 AWS Athena / Presto
jOOQ 文档中针对纯 SQL 模板的第一个示例显示了将对象转换为数组,但我似乎无法实现这一点。
在示例中,condition("{0} && {1}", array1, array2);
变为
ARRAY[1,4,3] && ARRAY[2,1]
。当我尝试使用一个数组时,它仅传递数组中的第一项,而不是转换为数组。我的数组都是整数:
Integer[] items
。这是我尝试过的代码:
var create = DSL.using(SQLDialect.DEFAULT);
var query = create.select(item_id, name, desc)
.from(table("item_table"))
.where("contains({0}, item_id)", items)
.getSQL(ParamType.INLINED);
我看到了这个类似的问题,但是当我将where更改为.where(items.eq(any(item_id)))
时,查询由一堆
item_id = 24805247 or item_id = 2156654
组成。我希望查询使用像示例中那样的数组,因为最终我将查询大约 30-50 个项目 ID(这是每周一次的后台任务,因此速度不是一个大问题)。
{0}
时,您正在使用模板占位符
?
(假设`items确实是一个Java数组):
.where("contains(?, item_id)", items)
或者,如果您更喜欢使用模板占位符,则必须传递 QueryPart
,例如一个显式绑定变量:
.where("contains({0}, item_id)", val(items))