【问题标题】:non-deterministic number of CASE WHEN clause in JOOQJOOQ 中 CASE WHEN 子句的不确定数量
【发布时间】:2016-03-10 22:31:45
【问题描述】:

我想像这样生成一个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。有什么解决办法吗?

【问题讨论】:

    标签: java sql case jooq


    【解决方案1】:

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

    DSL.decode(DEVICE.ID, 12, "some-string-1", 34, "some-string-2", ...);
    

    注意可变参数参数。它仍然有点笨拙,因为第一种情况必须在 varargs 参数之外传递。如果您使用的是 Oracle,这将转换为实际的 DECODE() 函数。如果您使用任何其他数据库,那将转换为您想到的 CASE 表达式。

    对于更一般的用例,#3691 已针对 jOOQ 3.8 实现,以允许以下操作:

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

    【讨论】:

      猜你喜欢
      • 2014-08-14
      • 2012-09-17
      • 1970-01-01
      • 2023-01-21
      • 2017-04-10
      • 1970-01-01
      • 2018-04-04
      • 2014-07-15
      相关资源
      最近更新 更多