首页 > 解决方案 > 在 CASE 上更新数值 table.column

问题描述

我想使用以下 postgresql

UPDATE table1 t1 
SET    column1 = ( 
       CASE 
              WHEN t1.column2 = 'yyy' THEN column1 = 10 * t2.column1 
              WHEN t1.column2 = 'zzz' THEN column1 = 10 * t2.column2 
       end) 
FROM   table2 t2

但我收到此错误:column1 是数字类型,但表达式是布尔类型 Line3:CASE

我该如何解决这个问题?

标签: postgresql

解决方案


该表达式column1 = 10 * t2.column1返回一个布尔值,因为它将 in 的值column1与乘法的结果进行比较。但是你只想要那里的乘法结果,所以你不需要比较=

您也没有 ELSE 部分,这意味着对于 column2 的所有其他值,column1 将设置为 NULL。或者——甚至更好——不要通过添加适当的 WHERE 子句来更新具有不同值的行。

但更重要的是:您需要两个表之间的连接,否则您会在两者之间创建一个交叉产品 - 您不希望这样!

UPDATE table1 t1 
  SET  column1 = CASE 
                   WHEN t1.column2 = 'yyy' THEN 10 * t2.column1 
                   WHEN t1.column2 = 'zzz' THEN 10 * t2.column2 
                 end
FROM   table2 t2
WHERE t2.t1_id = t1.id --<<< the join condition!
  and t1.column2 in ('yyy','zzz') -- don't update rows that don't need it

但是,如果您为值包含 WHERE 子句,我真的不认为需要以 CASE 表达式开头:

UPDATE table1 t1 
  SET  column1 = 10 * t2.column1 
FROM   table2 t2
WHERE t2.t1_id = t1.id
  and t1.column2 in ('yyy','zzz') 

推荐阅读