Выберите запрос как условие в Exposed

Как использовать метод DSL для генерации SELECT запрос в WHERE?

Пример:

SELECT *
FROM table
WHERE id IN (
    SELECT MAX(id)
    FROM table
    GROUP BY name
);

1 ответ

После поиска я нашел эту проблему на GitHub. wrapAsExpression можно использовать для составления подзапроса.

  1. копия EqOp и преобразовать его в InOp

    class InOp(expr1: Expression<*>, expr2: Expression<*>) : ComparisonOp(expr1, expr2, "IN")
    
  2. копия eq затем преобразовать его в inExpr функция расширения

    infix fun<T, S1: T?, S2: T?> Expression<in S1>.inExpr(other: Expression<in S2>) : 
    Op<Boolean> = InOp(this, other)
    
  3. Используй их

    Table.run {
        select { id inExpr wrapAsExpression(slice(id.max()).selectAll().groupBy(column)) }
    }
    

Пример вывода:

SELECT `user`.id, `user`.name, FROM `user` WHERE `user`.id IN (SELECT MAX(`user`.id) FROM `user` GROUP BY `user`.name)
Другие вопросы по тегам