PostgreSQL数据库:使用同一表中的某些条件,根据另一列值更改列值

ldioqlga  于 2022-11-04  发布在  PostgreSQL
关注(0)|答案(2)|浏览(168)

我有一个表,希望根据某些条件用其他列值中的值替换该列值。

+---------------------+
| Cntry | Code | Value |    
+---------------------+
| US  | C11  | A     | 
| US  | C12  | B     |
| US  | C13  | C     |
| US  | C14  | D     |
| US  | C15  | E     |
| UK  | C11  | A     | 
| UK  | C12  | B     |
| UK  | C13  | C     |
| UK  | C14  | D     |
| UK  | C15  | E     |

+---------------------+

我想将C14的值替换为基于Cntry的C11的值
所以我的输出应该是这样。

+---------------------+
| Cntry | Code | Value |
+---------------------+
| US  | C11  | A     | 
| US  | C12  | B     |
| US  | C13  | C     |
| US  | C14  | A     |<====Repalce with C11 for US
| US  | C15  | E     |
| UK  | C11  | G     | 
| UK  | C12  | B     |
| UK  | C13  | C     |
| UK  | C14  | G     |<====Repalce with C11 for UK
| UK  | C15  | E     |

+---------------------+

在postgresql中有什么方法可以做到这一点吗?
谢谢

i7uaboj4

i7uaboj41#

创建示例数据:

CREATE TABLE table1 (
    cntry varchar NULL,
    code varchar NULL,
    value varchar NULL
);

INSERT INTO table1 (cntry, code, value) VALUES('US', 'C11', 'A');
INSERT INTO table1 (cntry, code, value) VALUES('US', 'C12', 'B');
INSERT INTO table1 (cntry, code, value) VALUES('US', 'C13', 'C');
INSERT INTO table1 (cntry, code, value) VALUES('US', 'C14', 'D');
INSERT INTO table1 (cntry, code, value) VALUES('US', 'C15', 'E');
INSERT INTO table1 (cntry, code, value) VALUES('UK', 'C11', 'G');
INSERT INTO table1 (cntry, code, value) VALUES('UK', 'C12', 'B');
INSERT INTO table1 (cntry, code, value) VALUES('UK', 'C13', 'C');
INSERT INTO table1 (cntry, code, value) VALUES('UK', 'C14', 'D');
INSERT INTO table1 (cntry, code, value) VALUES('UK', 'C15', 'E');

示例查询:

select 
    t1.cntry, 
    t1.code, 
    case when t2.value is not null then t2.value else t1.value end as "value"
from table1 t1  
left join (
    select 
        cntry, 
        'C14' as code, 
        value 
    from table1
    where code = 'C11'
) t2 on t1.cntry = t2.cntry and t1.code = t2.code 

-- Result: 
cntry   code    value
US      C11     A
US      C12     B
US      C13     C
US      C14     A
US      C15     E
UK      C11     G
UK      C12     B
UK      C13     C
UK      C14     G
UK      C15     E
vtwuwzda

vtwuwzda2#

如果您想实际更改表的内容,那么UPDATE查询就可以了。

UPDATE mytable 
   SET code = 'C11' 
 WHERE code = 'C14'`

出于显而易见的原因,您应该非常小心地使用UPDATE查询。有几种方法可以避免我有时使用的错误:
1.首先尝试SELECT语句以获取我认为要更改的行。如果效果良好,则编辑查询以将SELECT更改为UPDATE
1.制作数据表的副本。在副本上尝试更新。如果您对结果满意,请在原始数据表上尝试查询。使用SELECT INTO建立数据表(SELECT * INTO tablecopy FROM mytable),然后在副本上使用DROP TABLEDROP tablecopy)。

相关问题