在 WHERE 中进行强制转换查询

Query with casting in WHERE

我正在学习这个很棒的库,但是虽然简单的查询有效,但我很困惑如何编写库常见问题解答中没有的东西。

例如,

create table if not exists ticks
(id bigserial not null constraint ticks_pkey primary key,
    timestamp timestamp not null
);

是否可以这样写

select coalesce(max(id), 0) from ticks where timestamp::date = ?

实际上,我这里有 2 个问题

  1. column.max() 没有任何合适的修饰符,例如 function() 不接受任何参数。也许,我可以在获取行后在代码中模拟它。

  2. 我不知道如何在 where 中进行转换或编写任意 where 条件。

如果可以将对象映射到您现有的 table,那么您可以尝试类似的操作:

object Ticks : LongIdTable() {
    val timestamp = datetime("timestamp ")
}

fun Expression<DateTime>.pgDate() = object : org.jetbrains.exposed.sql.Function<DateTime>(DateColumnType(false)) {
    override fun toQueryBuilder(queryBuilder: QueryBuilder) = queryBuilder {
        append(this@pgDate, "::date")
    }
}

val expr =  Coalesce(Ticks.id.max(), longLiteral(0))
Ticks.slice(expr).select {
    Ticks.timestamp.pgDate() eq DateTime.parse("2019-01-01")
}