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

如何更新PostgreSQL中多行的某些列,postgresql,Postgresql,我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value 表中有许多设备,每个设备只有一个设备ID(第1列);每个设备都有许多配置参数(第2列),例如版本、日期、公司等,所有设备都有相同的配置参数;不同设备的参数值(第3列)可能相同,也可能不同 我想用ID等于“id12345”的设备的新参数值(第3列)更新两个配置参数,如VER和DATE 如何在一个PostgreSQL查询中实现这一点?这是您可以做到的,尽管我认为这不是一个好主意

我有一个名为Configuration的表。表的第一列是deviceId,第二列是parameter,第三列是value

表中有许多设备,每个设备只有一个设备ID(第1列);每个设备都有许多配置参数(第2列),例如版本、日期、公司等,所有设备都有相同的配置参数;不同设备的参数值(第3列)可能相同,也可能不同

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


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

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

UPDATE configuration
    SET value = 
        CASE parameter 
            WHEN 'VER' THEN new_ver_value
            WHEN 'DATE' THEN new_date_value
        END
    WHERE deviceid = 'id12345';
像这样的参数表通常被认为是一个坏主意,因为这个查询的复杂性有助于说明这一点。此外,由于您说所有设备都有相同的参数,因此这样做而不是为每个参数指定唯一的列似乎没有任何用处

如果可能的话,也可以使用deviceid的数字,而不是字符串

根据要求,要更新其他字段(如设置为当前_时间的时间字段),可以执行以下操作

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


谢谢如果我有第4列“time”想要用列“value”更新,我该怎么做呢?在参数表中,您只需将它添加到
END
之后,用逗号分隔,类似于
time=current\u time
(或
current\u timestamp
),如果您只想在修改
VER
DATE
时设置它,那么您应该在
WHERE
子句中添加
和('VER',DATE')
中的参数。。如果您的表有单独的列,那么实际上每行只能保留一列。谢谢。当使用第一个代码更新参数时,所有设备都会得到更新,但不仅仅是设备“id12345”。。。。您能帮忙吗?第一个查询有问题,但您描述的查询没有问题。它需要在
WHERE
中添加一个附加子句,以防止它修改
公司
。但是,它只修改
id='id12345'
所在的行,正如我添加到答案中的测试所示。谢谢。我通过Heidi运行查询,我得到的日志是“/*受影响的行:75找到的行:0警告:1次查询的持续时间:0.000秒。(+0.047秒网络)*/”,它确实只更改了一行,但日志显示75行受影响。