PostgreSQL如何用单条查询更新同一列的多个不同值
单条SQL批量更新映射值的实现方案
有两种常用的实现方式,都可以在单条语句内完成全部更新:
方案1:使用CASE WHEN语句(全数据库兼容)
这是兼容性最高的写法,支持所有主流关系型数据库(MySQL、Oracle、SQL Server、PostgreSQL等),适合映射项数量不多的场景:
UPDATE CUSTOMERS SET BANK = CASE BANK WHEN '01' THEN 'Chase' WHEN '02' THEN 'BankOfAmerica' WHEN '03' THEN 'JPMorgan' WHEN '04' THEN 'WellsFargo' WHEN '05' THEN 'Citigroup' ELSE BANK -- 避免不在映射范围内的Bank值被清空 END;
如果不需要保留未匹配的原有值,可以加WHERE条件缩小更新范围,提升执行效率:
UPDATE CUSTOMERS SET BANK = CASE BANK WHEN '01' THEN 'Chase' WHEN '02' THEN 'BankOfAmerica' WHEN '03' THEN 'JPMorgan' WHEN '04' THEN 'WellsFargo' WHEN '05' THEN 'Citigroup' END WHERE BANK IN ('01','02','03','04','05');
方案2:构造临时映射表关联更新(支持VALUES子句的数据库适用)
如果映射项数量非常多,CASE WHEN写法会比较冗余,可以用VALUES构造临时映射表做关联更新,适合PostgreSQL、MySQL 8.0+、SQL Server等支持VALUES行构造器的数据库:
UPDATE CUSTOMERS c SET BANK = m.bank_name FROM ( VALUES ('01', 'Chase'), ('02', 'BankOfAmerica'), ('03', 'JPMorgan'), ('04', 'WellsFargo'), ('05', 'Citigroup') ) AS m(bank_code, bank_name) WHERE c.BANK = m.bank_code;
内容的提问来源于stack exchange,提问作者Tariq
相关产品推荐
相关产品推荐

