我有一个名为Configuration的表。该表的第一列是deviceId,第二列是参数,第三列是值。
在表中,有许多设备,每个设备只有一个设备ID(列1);每个设备都有许多配置参数(第2列),例如。 VER,DATE,COMPANY等,所有设备都具有相同的配置参数;不同设备的参数值(第3列)可以相同或不同。
我想用ID为“ id12345”的设备的新参数值(第3列)更新两个配置参数,例如VER和DATE。
如何在一个PostgreSQL查询中实现这一目标?
答案 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