如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值

Posted

技术标签:

【中文标题】如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值【英文标题】:JOOQ query to return a boolean if all rows based on a field has different value on another field 【发布时间】:2021-12-01 23:59:15 【问题描述】:

我正在编写一个 JOOQ 查询。例如我有这张桌子

ID Name Status
1 Erick Single
2 James Single
3 Erick Single
4 Erick Married

我想检查是否所有“Erick”都是“Single”。在这种情况下,它应该返回 false。

我尝试了这个 JOOQ 查询,我猜它有效:

return !context.fetchExists(
        context.selectFrom(TABLE_NAME)
        .where(TABLE_NAME.NAME.eq("Erick"),
                TABLE_NAME.STATUS.ne("Single"))
        ));

还有更优雅的方法吗?我的目标是在指针遇到“已婚”的“Erick”时立即返回,同时查询可读。

【问题讨论】:

【参考方案1】:

你的方法很好,但我猜你真的在寻找the EVERY aggregate function!

return context.fetchValue(
    select(every(TABLE_NAME.STATUS.eq("Single")))
    .from(TABLE_NAME)
    .where(TABLE_NAME.NAME.eq("Erick"))
);

甚至这个。这可能比上面的要慢,具体取决于您的 RDBMS 是否仍然可以为此使用索引,但您的实际查询可能更复杂,and you might need to aggregate multiple values in one go:

return context.fetchValue(
    select(every(TABLE_NAME.STATUS.eq("Single"))
        .filterWhere(TABLE_NAME.NAME.eq("Erick")))
    .from(TABLE_NAME)
);

【讨论】:

以上是关于如果基于一个字段的所有行在另一个字段上具有不同的值,则 JOOQ 查询返回一个布尔值的主要内容,如果未能解决你的问题,请参考以下文章