如何在单个查询 (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) 中更新一列中的不同值?的主要内容,如果未能解决你的问题,请参考以下文章

SQL如何查询出某一列中不同值出现的次数?

如果索引列不同,则从一列中求和值?

如何根据bigquery中另一列中的重复值计算一列

DB2 根据另一列中的不同值更新具有递增数字的列

sql中如何使一列中的多个重复数据只显示第一条

Python:在一列中为另一列中的单个值显示多个值