Java JOOQ中CASE-WHEN子句的非确定性数量

Java JOOQ中CASE-WHEN子句的非确定性数量,java,sql,case,jooq,Java,Sql,Case,Jooq,我想在如下子查询时生成一个案例: CASE DEVICE.ID WHEN 12 THEN 'some-string-1' WHEN 34 THEN 'some-string-2' END CaseValueStep<Integer> caseValueStep = DSL.decode().value(DEVICE.ID); for (Integer deviceId : devices.keySet()) { caseValueStep

我想在如下子查询时生成一个
案例:

CASE DEVICE.ID WHEN 12  THEN 'some-string-1'
               WHEN 34  THEN 'some-string-2'
END
CaseValueStep<Integer> caseValueStep = DSL.decode().value(DEVICE.ID);
for (Integer deviceId : devices.keySet()) {
    caseValueStep = caseValueStep.when(deviceId, devices.get(deviceId));
}
但是当
子句不确定并且在运行时可用时,
的数量。我有一个
映射
,当
条件出现时,键将是
,相应的值是
然后
部分。我需要的是这样的东西:

CASE DEVICE.ID WHEN 12  THEN 'some-string-1'
               WHEN 34  THEN 'some-string-2'
END
CaseValueStep<Integer> caseValueStep = DSL.decode().value(DEVICE.ID);
for (Integer deviceId : devices.keySet()) {
    caseValueStep = caseValueStep.when(deviceId, devices.get(deviceId));
}
CaseValueStep CaseValueStep=DSL.decode().value(DEVICE.ID);
对于(整数设备ID:devices.keySet()){
caseValueStep=caseValueStep.when(deviceId,devices.get(deviceId));
}

但是问题是在第一次
when()
之后,结果变成
CaseWhenStep
。有什么解决方案吗?

对于您的特定用例,是的,有一个解决方案通过:

注意varargs参数。这仍然有点笨拙,因为第一个案例必须在varargs参数之外传递。如果您使用的是Oracle,这将转换为实际的
DECODE()
函数。如果您使用的是任何其他数据库,那么这将转换为您心目中的
大小写
表达式

对于更一般的用例,已经为jOOQ 3.8实现了以下功能:

Map<Integer, String) map = ...
DSL.choose(DEVICE.ID).mapValues(map);
Map