jOOQ - 如何使用带有条件更新的.whereNotExists()?

时间:2018-02-02 14:35:41

标签: java sql postgresql jooq

我有一个以下的jOOQ查询,最初是在Lukas Eder问题的this帮助下撰写的。

create.insertInto(DATA,DATA.TICKER,DATA.OPEN,DATA.HIGH,DATA.LOW,DATA.CLOSE,DATA.DATE)
.select(
    select(
        val(dailyData.getTicker()),
        val(dailyData.getOpen()),
        val(dailyData.getHigh()),
        val(dailyData.getLow()),
        val(dailyData.getClose()),
        val(dailyData.getDate())
        )
    .whereNotExists(
        selectOne()
        .from(DATA)
        .where(DATA.DATE.eq(dailyData.getDate()))
    )
).execute();

此查询正常运行。另外,我想修改以完成以下专长,但我不确定它实际上是可行的。用简单的英语:

“如果表中不存在具有相同”日期“列的行,则插入行。如果存在并且”实时关闭“列为真,则更新”关闭“,否则不执行任何操作。”< / p>

现有查询已经涵盖了第一部分,但第二部分是if ... update ...不是,这就是我需要帮助的地方。

1 个答案:

答案 0 :(得分:1)

在普通的PostgreSQL中,您可以按如下方式编写此查询:

INSERT INTO data (ticker, open, high, low, close, date)
VALUES (:ticker, :open, :high, :low, :close, :date)
ON CONFLICT (date)
DO UPDATE SET close = false WHERE close

这转换为以下jOOQ查询:

DSL.using(configuration)
   .insertInto(DATA)
   .columns(
       DATA.TICKER, 
       DATA.OPEN,
       DATA.HIGH,
       DATA.LOW,
       DATA.CLOSE,
       DATA.DATE)
   .values(
       dailyData.getTicker(),
       dailyData.getOpen(),
       dailyData.getHigh(),
       dailyData.getLow(),
       dailyData.getClose(),
       dailyData.getDate())
   .onConflict()
   .doUpdate()
   .set(DATA.CLOSE, inline(false))
   .where(DATA.CLOSE)
   .execute();