将 Oracle upsert 转换为 PostgreSQL 准备语句
Converting Oracle upsert to PostgreSQL prepared statement
我想将 upsert 查询从 Oracle DB 迁移到 PostgreSQL。下面显示了一个 Oracle 准备好的语句,它从 dual 中获取值并对 DUMMY table.
执行更新插入操作
MERGE INTO DUMMY a
USING (SELECT ? ID,
? NAME,
? SIZE from dual) b
ON (a.ID = b.ID)
WHEN MATCHED THEN
UPDATE
SET a.ID = b.ID,
a.NAME = b.NAME,
a.SIZE = b.SIZE
WHEN NOT MATCHED THEN
INSERT(a.ID,
a.NAME,
a.SIZE)
VALUES ( b.ID,
b.NAME,
b.SIZE)
我想使用 dual 将其转换为 PostgreSQL。下面是我的 PostgreSQL 尝试,但我不能在 using 语句中使用 select 语句。能指出问题出在哪里吗?
INSERT INTO DUMMY(id,name,size)
values (SELECT ? id,
? name,
? size from dual) b
ON conflict(id)
do UPDATE
SET a.id= b.id,
a.name=b.name,
a.size=b.size;
不需要值的别名。您可以使用 excluded
关键字引用这些值:
INSERT INTO DUMMY(id,name,size)
values (?, ?, ?)
ON conflict(id)
do UPDATE
SET name = excluded.name,
size = excluded.size;
请注意,我删除了 ID 列的更新,因为它没有用,因为根据定义,新值必须与现有值相同。
我想将 upsert 查询从 Oracle DB 迁移到 PostgreSQL。下面显示了一个 Oracle 准备好的语句,它从 dual 中获取值并对 DUMMY table.
执行更新插入操作MERGE INTO DUMMY a
USING (SELECT ? ID,
? NAME,
? SIZE from dual) b
ON (a.ID = b.ID)
WHEN MATCHED THEN
UPDATE
SET a.ID = b.ID,
a.NAME = b.NAME,
a.SIZE = b.SIZE
WHEN NOT MATCHED THEN
INSERT(a.ID,
a.NAME,
a.SIZE)
VALUES ( b.ID,
b.NAME,
b.SIZE)
我想使用 dual 将其转换为 PostgreSQL。下面是我的 PostgreSQL 尝试,但我不能在 using 语句中使用 select 语句。能指出问题出在哪里吗?
INSERT INTO DUMMY(id,name,size)
values (SELECT ? id,
? name,
? size from dual) b
ON conflict(id)
do UPDATE
SET a.id= b.id,
a.name=b.name,
a.size=b.size;
不需要值的别名。您可以使用 excluded
关键字引用这些值:
INSERT INTO DUMMY(id,name,size)
values (?, ?, ?)
ON conflict(id)
do UPDATE
SET name = excluded.name,
size = excluded.size;
请注意,我删除了 ID 列的更新,因为它没有用,因为根据定义,新值必须与现有值相同。