【问题标题】:How can I update different values in one column in a single query (PSQL)?如何在单个查询 (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' ;
...

必须逐行执行。

有人知道我如何一次性执行此操作吗?

提前谢谢你。

【问题讨论】:

    标签: sql postgresql sql-update


    【解决方案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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-08-22
      • 1970-01-01
      • 2017-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-18
      相关资源
      最近更新 更多