java - jOOQ - 如何使用 .whereNotExists() 进行条件更新?

标签 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();

这个查询工作正常。另外,我想修改以完成以下壮举,但我不确定它是否真的可行。用简单的英语:

“如果表中不存在具有相同‘日期’列的行,则插入该行。如果存在且‘实时关闭’列为真,则更新‘关闭’,否则什么都不做。”

第一部分已包含在现有查询中,但第二部分 if...update... 未涵盖,这正是我需要帮助的地方。

最佳答案

在普通的 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();

关于java - jOOQ - 如何使用 .whereNotExists() 进行条件更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48584925/

相关文章:

java - 在java中使用自定义比较器在数组中搜索

java正则表达式支持非ascii值吗?

sql - 在 Oracle 中使用 LISTAGG 进行字符串格式化。转义单引号 ` ' `

postgresql - 无法连接到 pgpool

ios - 如何从 ios9 连接到 postgresql

python - Psycopg2,Postgresql,Python : Fastest way to bulk-insert

java - java数组对象的所有索引都具有相同的值

java - 覆盖多级别 POM 中的依赖/插件管理

sql - 我如何知道 CONSTRAINT_NAME 是主键还是外键?

php - 如何在查询中用 0 替换 NULL?