如何更新PostgreSQL中多行的某些列

时间:2019-07-15 23:27:06

标签: postgresql

我有一个名为Configuration的表。该表的第一列是deviceId,第二列是参数,第三列是值。

在表中,有许多设备,每个设备只有一个设备ID(列1);每个设备都有许多配置参数(第2列),例如。 VER,DATE,COMPANY等,所有设备都具有相同的配置参数;不同设备的参数值(第3列)可以相同或不同。

我想用ID为“ id12345”的设备的新参数值(第3列)更新两个配置参数,例如VER和DATE。

如何在一个PostgreSQL查询中实现这一目标?

1 个答案:

答案 0 :(得分:1)

这是您可以做的,尽管我认为这不是一个好主意。

UPDATE configuration
    SET value = 
        CASE parameter 
            WHEN 'VER' THEN new_ver_value
            WHEN 'DATE' THEN new_date_value
        END
    WHERE deviceid = 'id12345';

像这样的参数表通常被认为是一个坏主意,因为此查询的复杂性有助于说明。另外,由于您说所有设备都具有相同的参数,因此这样做似乎并没有带来任何有用的效果。

如果可能的话,也可以仅使用数字作为设备ID,而不是字符串。

根据要求,要更新其他字段,例如将时间字段设置为current_time,可以执行以下操作。

UPDATE configuration
    SET value = 
        CASE parameter 
            WHEN 'VER' THEN new_ver_value
            WHEN 'DATE' THEN new_date_value
        END,
        time = current_time
    WHERE deviceid = 'id12345'
        AND parameter IN ('VER', 'DATE');

对于第一个查询,这是一个显示结果的测试。

CREATE TABLE configuration 
   (deviceid CHARACTER VARYING (20),
    parameter CHARACTER VARYING (10),
    VALUE integer);

INSERT INTO configuration
(VALUES ('id12345', 'VER', 1),
        ('id12345', 'DATE', 20190101),
        ('id12345', 'COMPANY', 55),
        ('id33333', 'VER', 2),
        ('id33333', 'DATE', 20180101),
        ('id33333', 'COMPANY', 6));

SELECT * FROM configuration;

id12345    VER     1
id1234     DATE    20190101
id12345    COMPANY 55
id33333    VER     2
id33333    DATE    20180101
id33333    COMPANY 6

UPDATE configuration
    SET value = 
        CASE parameter 
            WHEN 'VER' THEN 11
            WHEN 'DATE' THEN 2020010
        END
    WHERE deviceid = 'id12345'
        AND parameter IN ('VER', 'DATE');

SELECT * FROM configuration;

id12345   COMPANY   55
id33333   VER       2
id33333   DATE      20180101
id33333   COMPANY   6
id12345   VER       11
id12345   DATE      2020010