如何在jOOQ中实现ORDER BY里非匹配值的CASE WHEN排序?
jOOQ实现多条件分支排序
简化匹配预定义值的CASE语句
你之前为每个值单独编写when分支,其实jOOQ支持直接用in()匹配值列表,无需重复写多个when分支,代码可简化为:
queryBuilder.addOrderBy( case_() .when(MYTABLE.FIELDA.in("val1", "val2"), MYTABLE.FIELDB) .desc() );
这里使用不带字段参数的case_()重载方法,比带字段的case_(MYTABLE.FIELDA)更灵活,适合处理in这类多值匹配条件。
实现不匹配值时的升序排序
你需要转换的SQL语句CASE WHEN mytable.fielda NOT IN ('val1','val2') THEN mytable.fieldb END ASC,对应的jOOQ代码如下:
queryBuilder.addOrderBy( case_() .when(MYTABLE.FIELDA.notIn("val1", "val2"), MYTABLE.FIELDB) .asc() );
如果要把两个排序逻辑合并到同一个ORDER BY子句中,直接连续调用addOrderBy或传入多个排序字段即可:
queryBuilder.addOrderBy( // 匹配val1/val2时按FIELDB降序 case_().when(MYTABLE.FIELDA.in("val1", "val2"), MYTABLE.FIELDB).desc(), // 不匹配时按FIELDB升序 case_().when(MYTABLE.FIELDA.notIn("val1", "val2"), MYTABLE.FIELDB).asc() );
注意事项
jOOQ的case_()表达式若未指定else分支,不满足条件时会返回null,排序时null的位置取决于数据库默认规则(通常升序时null排末尾,降序时排开头)。如果需要明确控制null的排序位置,可添加.else_(...)分支定义默认值。
内容的提问来源于stack exchange,提问作者helion3
相关产品推荐
相关产品推荐

