postgresql 在同一个SQL UPDATE语句中是否可以对字段进行计算?

nkcskrwz  于 5个月前  发布在  PostgreSQL
关注(0)|答案(1)|浏览(77)

我用的是PostGres 13。
下面是一个示例:

UPDATE table
SET
  sum_col = col_1 + col_2,
  another_sum_col = sum_col + col_3;

字符串
sum_col中的计算是否可用于下一个字段的计算(another_sum_col)?
我正在做的事情比这更复杂,我遇到了差异,如果计算在同一个UPDATE中不可用,这可能是可以解释的。换句话说,我需要运行第二个UPDATE

d7v8vwbk

d7v8vwbk1#

**不,它不可用。**SQL标准对此很清楚:UPDATEonly takes the "before" valuesSET部分的右侧,而不是“after”值。MySQL和MariaDB不遵循这一点,但它们不遵循规范。

但是你不需要第二个UPDATE,你可以使用一个相关的(横向的)计算。这是a generalized technique,用于在不使用新级别的派生表或视图的情况下提供中间计算。
令人烦恼的是,在Postgres中,你不能使用表中的列在横向连接中进行更新。我能看到的唯一方法是自连接表。(然而,SQL Server允许你直接使用正在更新的表。)

UPDATE yourtable
SET
  sum_col = v.newSumCol,
  another_sum_col = v.NewSumCol + yourtable.col_3
FROM yourtable t
CROSS JOIN LATERAL (
  SELECT t.col_1 + t.col_2 AS newSumCol
  ) v
WHERE t.yourPK = yourtable.yourPK;

字符串
您也可以在前面提到的SELECT中执行此操作

SELECT
  v.newSumCol
  v.NewSumCol + yourtable.col_3 AS another_sum_col
FROM yourtable t
CROSS JOIN LATERAL (
  SELECT col_1 + col_2 AS newSumCol
  ) v;

相关问题