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

问题描述

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

ID 姓名 地位
1 埃里克 单身的
2 詹姆士 单身的
3 埃里克 单身的
4 埃里克 已婚

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

我尝试了这个 JOOQ 查询,我想它可以工作:

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

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

标签: sqljooq

解决方案


你的方法很好,但我想你真的在寻找聚合EVERY函数

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

甚至这个。这可能比上面的要慢,具体取决于您的 RDBMS 是否仍然可以为此使用索引,但您的实际查询可能更复杂,您可能需要一次性聚合多个值

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

推荐阅读