我有一个表TABLE
,其中包含一个名为tags
的jsonb列。每行中的tags
元素可能包含也可能不包含名为group
的字段。我的目标是按tags.group
对tags
包含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中表达出来?
答案 0 :(得分:0)
这里有两件事值得一提:
?
运算符不幸的是,由于?
目前严格限制在PostgreSQL JDBC驱动程序中用作绑定变量占位符,因此没有很好的解决方案。因此,即使您可以找到通过jOOQ将该字符发送到服务器的方法,JDBC驱动程序仍然会误解它。
A workaround is documented in this Stack Overflow question
当你在jOOQ中使用plain SQL templating language时,请注意有一个解析器会解析你的字符串的某些标记,包括例如注释和字符串文字。这意味着您使用...
DSL.field("{0}->>'{1}'", String::class.java, TABLE.TAGS, "group")
不正确,因为'{1}'
将被解析为字符串文字并按原样发送到服务器。如果要使用变量字符串文字,请改为:
DSL.field("{0}->>{1}", String::class.java, TABLE.TAGS, DSL.inline("group"))