首页 > 解决方案 > 具有 N 次元组的 jOOQ "IN" 谓词

问题描述

我需要一个WHERE子句来检查IN列表的元组:(field1, field2) in (('1', 1), ('2', 2), ('3', 3))。这是 Postgres 中的有效 SQL。

方言:POSTGRES

jOOQ 版本:3.9.6

这种情况下正确的 jOOQ 语法是什么?

jOOQ 3.9 文档暗示这是可能的,但他们的示例仅给出 1 级:https ://www.jooq.org/doc/3.9/manual/sql-building/conditional-expressions/in-predicate-degree-n/

这段代码给出了我正在寻找的近似值,但我无法获得正确的类型/数据,referenceOrderIdLineNumbers也无法获得 jOOQ 生成的正确 SQL。

Collection<Row2<String, Integer>> referenceOrderIdLineNumbers = ...
List<Object[]> rows = dsl.select(... , field("count(TABLE3)", Integer.class )
  .from(Tables.TABLE1)
  .join(Tables.TABLE2).on(Tables.TABLE2.PK1.eq(Tables.TABLE1.PK1))
  .join(Tables.TABLE3).on(Tables.TABLE3.PK2.eq(Tables.TABLE2.PK2))
  .where(
    row(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2) // <-- what to 
    .in(referenceOrderIdLineNumbers)                // <-- do here??
  )
  .groupBy(...)
  .fetch();

标签: javasqlpostgresqljooq

解决方案


这对我来说是按预期工作的。您可以尝试让 jOOQ 记录它为您生成的 SQL,并尝试直接对您的数据库运行所述 SQL。

参考:

Collection<Row2<String, Integer>> field1Field2Collection = new LinkedList<>();
field1Field2Collection.add(row("1", 1));
field1Field2Collection.add(row("2", 2));
field1Field2Collection.add(row("3", 3));

Result<Record2<String, Integer>> field1Field2Results = dsl
        .select(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2)
        .from(Tables.TABLE1)
        .join(Tables.TABLE2).on(Tables.TABLE2.PK1.eq(Tables.TABLE1.PK1))
        .where(row(Tables.TABLE1.FIELD1, Tables.TABLE2.FIELD2).in(field1Field2Collection))
        .fetch();

推荐阅读