代码之家  ›  专栏  ›  技术社区  ›  JJ Zabkar

带有N次元组的jOOQ“IN”谓词

  •  4
  • JJ Zabkar  · 技术社区  · 5 年前

    我需要一个 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();
    
    0 回复  |  直到 5 年前
        1
  •  4
  •   Lee Marlow    5 年前

    这是为我准备的。您可以尝试让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();