如何在单个查询 (PSQL) 中更新一列中的不同值?
Posted
技术标签:
【中文标题】如何在单个查询 (PSQL) 中更新一列中的不同值?【英文标题】:How can I update different values in one column in a single query (PSQL)? 【发布时间】:2021-08-10 20:46:31 【问题描述】:我需要根据“图例”更新单个列中的多个值(因为没有更好的词)。
假设这是我当前的表 (CUSTOMERS)
Cust_Name | Bank |
---|---|
William | 01 |
Harry | 02 |
John | 05 |
Jack | 01 |
Matthew | 03 |
这就是“传说”
这个图例在数据库中不存在,它只是用来解释我的例子。它只是一种呈现对应值的方式
Bank Number | Bank |
---|---|
01 | Chase |
02 | BankOfAmerica |
03 | JPMorgan |
04 | WellsFargo |
05 | Citigroup |
我想更新客户表以显示银行名称而不是银行编号。 当我第一次尝试这样做时,它看起来像这样:
update CUSTOMERS
set BANK = 'Chase'
where BANK = '01' ;
update CUSTOMERS
set BANK = 'BankOfAmerica'
where BANK = '02' ;
...
必须逐行执行。
有人知道我如何一次性执行此操作吗?
提前谢谢你。
【问题讨论】:
【参考方案1】:使用
UPDATE CUSTOMERS
SET BANK = CASE
WHEN BANK = '01' THEN 'Chase'
WHEN BANK = '02' THEN 'BankOfAmerica'
WHEN BANK = '03' THEN 'JPMorgan'
WHEN BANK = '04' THEN 'WellsFargo'
WHEN BANK = '05' THEN 'Citigroup'
END
db<>fiddle中的演示
【讨论】:
谢谢。但我应该更清楚,数据库中不存在图例表,我不希望它存在。这只是表达我试图做的事情的一种方式,即用新的对应值替换旧值。【参考方案2】:在 Postgres 中,你可以这样表达:
update customers c
set bank = l.bank
from legend l
where c.bank = l.bank_no;
但是,我不明白您为什么要更新实际名称。为什么在查询表时不直接使用join
?
编辑:
根据您的评论,您应该创建图例表。在任何情况下,您都可以为查询创建一个版本:
update customers c
set bank = l.bank
from (values ('01', 'Chase'),
('02', 'BankOfAmerica'),
('03', 'JPMorgan'),
('04', 'WellsFargo'),
('05', 'Citigroup')
) v(bank_no, bank);
where c.bank = l.bank_no;
【讨论】:
谢谢。但我应该更清楚,数据库中不存在图例表,我不希望它存在。这只是表达我试图做的事情的一种方式,即用新的对应值替换旧值。【参考方案3】:您可以从 VALUES 子句进行更新:
update customers c
set bank = v.bank_name
from (
values
('01', 'Chase'),
('02', 'BankOfAmerica'),
('03', 'JPMorgan'),
('04', 'WellsFargo'),
('05', 'Citigroup')
) as v(bank_number, bank_name)
where v.bank_number = c.bank;
【讨论】:
以上是关于如何在单个查询 (PSQL) 中更新一列中的不同值?的主要内容,如果未能解决你的问题,请参考以下文章