sql - 如果基于一个字段的所有行在另一个字段上具有不同的值,则 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”时立即返回,同时查询是可读的。
解决方案
你的方法很好,但我想你真的在寻找聚合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)
);
推荐阅读
- python - 连接 django 和 mysql 时出现 OperationalError
- arrays - 循环函数向变量添加不准确的值,并且在跟踪代码时未定义数组。怎么修?
- prolog - prolog中如何实现逻辑运算符
- string - 将数字转换为字符串以保持排序顺序
- php - Laravel 使用错误的所有者生成日志文件
- android - 如何以编程方式在 Android 应用程序之间切换
- python - LoweringError 是什么意思?
- c# - 单元测试 - 模拟 - 可覆盖问题 - 扩展方法
- javascript - Angular Elements Web 组件中的 NgFor 使用 JSON 文件:如何获取值
- javascript - 将对象添加到父数组