我有一个名为Configuration的表。表的第一列是deviceId,第二列是参数,第三列是值。
在表中,有许多设备,每个设备只有一个设备ID(第1列);每个设备都有许多配置参数(第2列),例如:VER、DATE、COMPANY等,所有设备都有相同的配置参数;不同设备的参数值(第3列)可能相同,也可能不同。
我想为ID等于"id12345“的设备更新两个配置参数,即VER和DATE,并使用新参数的值(第3列)。
如何在一个PostgreSQL查询中实现这一点?
发布于 2019-07-16 07:40:48
这就是你可以做的,尽管我不认为这是一个很棒的想法。
UPDATE configuration
SET value =
CASE parameter
WHEN 'VER' THEN new_ver_value
WHEN 'DATE' THEN new_date_value
END
WHERE deviceid = 'id12345';像这样的参数表通常被认为是一个坏主意,因为这个查询的复杂性有助于说明这一点。此外,由于您说所有的设备都有相同的参数,所以这样做而不是为每个参数都有一个唯一的列似乎不会实现任何有用的结果。
此外,如果可能,只使用数字作为设备if,而不是字符串。
根据请求,要更新额外的字段,如设置为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 2020010https://stackoverflow.com/questions/57048264
复制相似问题