测试 JOOQ Postgres 中的 JSONB 列是否存在键。

4

我有一个表格 TABLE,其中包含一个名为 tags 的jsonb列。每行中的 tags 元素可能包含或不包含一个名为 group 的字段。我的目标是对所有包含 group 字段的 tags 进行 tags.group 分组。就像以下的Postgres查询:

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

我正在尝试将代码转换为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中测试包含条件@>,但我需要执行exists条件?。我该如何在JOOQ中表达这一点?

1个回答

0

这里有两件值得一提的事情:

JDBC中的?运算符

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

此Stack Overflow问题中记录了一种解决方法

纯SQL和字符串字面量

当您在jOOQ中使用纯SQL模板语言时,请注意存在一个解析器,将解析您字符串中的某些标记(包括注释和字符串字面量)。这意味着您的用法...

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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接