【问题标题】:test JOOQ postgres jsonb column for key exists测试 JOOQ postgres jsonb 列是否存在键
【发布时间】:2018-02-18 00:01:43
【问题描述】:

我有一个表 TABLE,其中包含一个名为 tags 的 jsonb 列。每行中的tags 元素可能包含也可能不包含名为group 的字段。我的目标是按tags.grouptags 包含group 字段的所有行进行分组。像下面的 postgres 查询:

select tags->>'group' as group, sum(n) as sum
from TABLE
where tags ? 'group'
group by tags->>'group';

我正在尝试将其转换为 JOOQ,但无法找到如何表达 where tags ? 'group' 条件。

例如,

val selectGroup = DSL.field("{0}->>'{1}'", String::class.java, TABLE.TAGS, "group")
dsl().select(selectGroup, DSL.sum(TABLE.N))
  .from(TABLE)
  .where(TABLE.TAGS.contains('group'))
  .groupBy(selectGroup)

这相当于在 postgres 中测试包含条件@>。但我需要做存在条件?。我如何在 JOOQ 中表达这一点?

【问题讨论】:

    标签: postgresql kotlin jooq


    【解决方案1】:

    这里有两点值得一提:

    JDBC 中的? 运算符

    不幸的是,没有很好的解决方案,因为? 目前被严格限制为在 PostgreSQL JDBC 驱动程序中用作绑定变量占位符。所以,即使你能找到一种方法通过 jOOQ 将该字符发送到服务器,JDBC 驱动程序仍然会误解它。

    A workaround is documented in this Stack Overflow question.

    纯 SQL 和字符串字面量

    当您在 jOOQ 中使用 plain SQL templating language 时,请注意有一个解析器会解析您的字符串的某些标记,包括例如cmets 和字符串文字。这意味着您使用...

    DSL.field("{0}->>'{1}'", String::class.java, TABLE.TAGS, "group")
    

    不正确,因为'{1}' 将被解析为字符串文字并按原样发送到服务器。如果要使用可变字符串文字,请改为:

    DSL.field("{0}->>{1}", String::class.java, TABLE.TAGS, DSL.inline("group"))
    

    另见DSL.inline()

    【讨论】:

      猜你喜欢
      • 2021-03-07
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多