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

标签 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 。有什么解决办法吗?

最佳答案

对于您的特定用例,是的,可以通过 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/

相关文章:

sql - 使用PROC SQL查找与SAS中给定字符串最多一个字母不同的字符串

mysql - if 时我该如何使用 mysql case?

php - 如何停止循环并添加值?

java - 两个微调器显示相同的条目

java - 在框架调整大小 Java 上调整组件大小

java - Lwuit虚拟键盘错误

sql - 如何检索具有相同状态的连续记录的最大日期间隔?

mysql - 如何控制具有 n...可选属性的元素库存?

带有字符串变量的 Javascript 开关不起作用

java - 在更改器(mutator)中使用方法声明的变量?