postgresql - 在 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
我该如何解决这个问题?
解决方案
该表达式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')
推荐阅读
- r - 在 R 中下载、绘制地图和提取数据
- database - 如何生成适合我的房间方案的数据库?
- inheritance - 如何在c ++中创建继承的复制构造函数,参数中有一个基类对象
- c++ - 无法弄清楚如何从点云库初始化 SampleConsensusModelNormalPlane
- authentication - 具有认知身份验证的烧瓶应用程序给出状态错误或{“消息”:“未提供令牌”}
- javascript - d3.js v7 - scaleOrdinal - 颜色子节点与父节点相同
- python - 我试图使用 Beautiful Soup 从 Monster Job 中抓取数据但我没有设法获得任何工作卡
- azure-devops - 如何解决免费套餐中的“未购买或授予托管并行性”?
- docker - 在 Dockerfile 中连接多个 ENV 的正确语法?
- sql - 编写一个 sql 查询以使用数据透视在单行中捕获以下信息