2014-10-16 1 views
2

Я хочу, чтобы сгенерировать CASE WHEN суб запрос следующим образом:недетерминировано число случая, когда положение в JOOQ

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. Есть ли какое-нибудь решение?

ответ

2

Для вашего конкретного варианта использования, да, есть решение через 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);