我想生成一个CASE WHEN
像这样的子查询:
CASE DEVICE.ID WHEN 12 THEN 'some-string-1'
WHEN 34 THEN 'some-string-2'
END
但数量WHEN
子句是不确定的,并且在运行时可用。我有一个Map<Integer, String>
关键是 WHEN
条件对应的值为THEN
部分。我需要的是这样的:
CaseValueStep<Integer> caseValueStep = DSL.decode().value(DEVICE.ID);
for (Integer deviceId : devices.keySet()) {
caseValueStep = caseValueStep.when(deviceId, devices.get(deviceId));
}
但问题出在第一个when()
之后结果变成CaseWhenStep
。有什么解决办法吗?
最佳答案
对于您的特定用例,是的,可以通过 DSL.decode()
找到解决方案:
DSL.decode(DEVICE.ID, 12, "some-string-1", 34, "some-string-2", ...);
注意 varargs 参数。它仍然有点笨拙,因为第一个案例必须在 varargs 参数之外传递。如果您使用的是 Oracle,这将转换为实际的 DECODE()
函数。如果您使用任何其他数据库,它将转换为您想要的 CASE
表达式。
对于更一般的用例,#3691已针对 jOOQ 3.8 实现,以实现以下功能:
Map<Integer, String) map = ...
DSL.choose(DEVICE.ID).mapValues(map);
关于java - JOOQ 中 CASE WHEN 子句的非确定性数量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26397185/