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

时间:2014-10-16 05:55:50

标签: java sql case jooq

我想生成一个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。有没有解决方案?

1 个答案:

答案 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);