【问题标题】:JOOQ EXISTS clause with plain SQL带有纯 SQL 的 JOOQ EXISTS 子句
【发布时间】:2020-02-27 17:48:32
【问题描述】:

我正在构建 JOOQ 查询的 WHERE 子句。某些条件使用 EXISTS,我想将子查询作为普通 SQL 提供,因为它们是用 JOOQ 表达的冗长的。例如。

select 1 from jsonb_array_elements(resource->'name') as t1,
  jsonb_array_elements_text(t1.value->'given') as t2
where t2.value like ?

然而 DSL.exists() 只接受 Select 类型作为参数,无论我使用哪种 DSL.select...() 方法,它都会用另一个 select 包装我的 SQL sn-p。

DSL.exists(DSL.selectFrom(DSL.sql(...)))

查询将是这样的:

... where exists (select * from (select 1 from ...

有没有办法避免不必要的包装选择?

【问题讨论】:

    标签: postgresql jooq


    【解决方案1】:

    您可以使用这样的普通 SQL 条件:

    Condition condition = DSL.condition("exists (<your select here>)");
    

    【讨论】:

      【解决方案2】:

      为什么要把 SQL 放到 DSL.sql 中?

      您可以将SQL字符串直接传递给selectFrom:

      DSL.exists(DSL.selectFrom(...))
      

      那么你没有得到这个包装器选择。

      【讨论】:

      • 后来我删除了它,但是 selectFrom 仍然创建了包装器。
      【解决方案3】:

      现在我所能做的就是将 SQL 分割成子句。我仍然会对不同的解决方案感兴趣。

      return DSL.exists(DSL.selectOne().from(
          "jsonb_array_elements(resource->'name') as t1," +
          " jsonb_array_elements_text(t1.value->'given') as t2"
      ).where(
          "t2.value like ?", pattern)
      );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-01-05
        • 1970-01-01
        • 1970-01-01
        • 2021-11-09
        • 2020-06-04
        • 2013-04-17
        • 2013-02-10
        • 1970-01-01
        相关资源
        最近更新 更多