我想生成一个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
。有没有解决方案?
答案 0 :(得分:2)
对于您的特定用例,是的,通过DSL.decode()
提供了解决方案:
DSL.decode(DEVICE.ID, 12, "some-string-1", 34, "some-string-2", ...);
请注意varargs参数。它仍然有点笨拙,因为第一种情况必须在varargs论证之外传递。如果您使用的是Oracle,则会转换为实际的DECODE()
函数。如果您正在使用任何其他数据库,那么这将转换为您所考虑的CASE
表达式。
对于更一般的用例,已为jOOQ 3.8实施#3691以允许以下内容:
Map<Integer, String) map = ...
DSL.choose(DEVICE.ID).mapValues(map);