jOOQ - Building a dynamic `CASE WHEN` with DSL

23 Views Asked by At

I'm working with jOOQ and want to construct a dynamic CASE WHEN expression using the DSL. The desired outcome is a structure like this:

var myCase = DSL.case_()
  .when(condition1, result1)
  .when(condition2, result2)
  // ... additional WHEN clauses
  .else_(defaultValue);

However, a naive approach using a loop and subsequent .when calls encounters an issue. Since the return type of DSL.case_() changes after the first .when, adding a dummy initial condition like DSL.falseCondition() becomes necessary. This code below works, but feels clunky:

var myCase = DSL.case_()
  .when(DSL.falseCondition(), null); // Hack to change myCase's type

for (var entry:conditions)
  myCase.when( entry.getKey(), entry.getValue() )

return myCase.else_(defaultValue)

Is there a way to avoid this hack and build a dynamic CASE WHEN expression in jOOQ using the DSL?

1

There are 1 best solutions below

1
Lukas Eder On BEST ANSWER

Do this:

if (conditions.isEmpty())
    return defaultValue;

CaseConditionStep<T> c = null;

for (var entry : conditions)
    c = c == null 
        ? DSL.when(entry.getKey(), getValue()) 
        : c.when(entry.getKey(), getValue());

return c.else_(defaultValue);