您所描述的形式目前无法实现您想要的,但我认为您可以使用UPDATE ... RETURNING
. 参见UPDATE ... RETURNING
手册。
UPDATE <target_table>
SET Proprerty0 = Value0
WHERE <predicate>
RETURNING Property0;
很难确定,因为您提供的示例是如此抽象以至于毫无意义。
您还可以使用 wCTE,它允许更复杂的情况:
WITH updated_rows AS (
UPDATE <target_table>
SET Proprerty0 = Value0
WHERE <predicate>
RETURNING row_id, Property0
)
SELECT row_id, some_computed_value_from_property
FROM updated_rows;
请参阅公用表表达式(WITH
查询)和depesz 关于 wCTE 的文章。
更新基于问题中的一些附加细节,这是一个使用的演示UPDATE ... RETURNING
:
CREATE TABLE upret_demo(
id serial primary key,
somecol text not null,
last_updated timestamptz
);
INSERT INTO upret_demo (somecol, last_updated) VALUES ('blah',current_timestamp);
UPDATE upret_demo
SET
somecol = 'newvalue',
last_updated = current_timestamp
WHERE last_updated = '2012-12-03 19:36:15.045159+08' -- Change to your timestamp
RETURNING
somecol || '_computed' AS a,
'totally_new_computed_column' AS b;
第一次运行时输出:
a | b
-------------------+-----------------------------
newvalue_computed | totally_new_computed_column
(1 row)
再次运行时,它将不起作用并且不返回任何行。
如果您在结果集中有更复杂的计算要做,您可以使用 wCTE,这样您就可以 JOIN 更新的结果并执行其他复杂的事情。
WITH upd_row AS (
UPDATE upret_demo SET
somecol = 'newvalue',
last_updated = current_timestamp
WHERE last_updated = '2012-12-03 19:36:15.045159+08'
RETURNING id, somecol, last_updated
)
SELECT
'row_'||id||'_'||somecol||', updated '||last_updated AS calc1,
repeat('x',4) AS calc2
FROM upd_row;
换句话说:UPDATE ... RETURNING
直接使用 来生成计算的行,或者在可写的 CTE 中用于更复杂的情况。