基于 CASE WHEN 更新视图
Update a view based on CASE WHEN
我想更改 table 上每一列的值。
这就是我得到的:
CREATE VIEW old_employee AS
SELECT *
FROM dblink('dbname=mydb', 'select study, gloves, apron, vocation from personnel')
AS t1(study char(10), gloves integer, apron integer, vocation integer);
SELECT * FROM old_employee;
study | gloves | apron | vocation
------------+------------------+------------+
STUDY1 | 1 | 1 | 1 |
STUDY2 | 2 | 2 | 2 |
STUDY3 | 0 | 2 | 3 |
STUDY3 | 1 | 0 | 4 |
我想要的输出
study | gloves | apron | vocation
------------+------------------+------------+
1 | 51 | 54 | 35 |
2 | 53 | 56 | 37 |
3 | 52 | 56 | 43 |
4 | 51 | 55 | 45 |
我的第一个想法是在更新时使用多个 CASE WHEN。类似于:
UPDATE old_employee
SET study = (
SELECT studies.id
FROM studies
INNER JOIN old_employee
ON studies.name_string = old_employee.study
),
gloves = (
SELECT CASE
WHEN gloves = 0 THEN 52
WHEN gloves = 1 THEN 51
WHEN gloves = 2 THEN 53
END
FROM old_employee
),
apron = (
SELECT CASE
WHEN apron = 0 THEN 55
WHEN apron = 1 THEN 54
WHEN apron = 2 THEN 56
END
FROM old_employee
),
vocation = (
SELECT CASE
WHEN vocation = 1 THEN 35
WHEN vocation = 2 THEN 37
WHEN vocation = 3 THEN 43
WHEN vocation = 4 THEN 45
END
FROM old_employee
);
显然这是行不通的,我想知道我是在正确地解决这个问题还是遗漏了什么。我是一名程序员,刚接触 SQL,所以我不太习惯 SQL 的心态。
虽然视图在 postgesql 9.3 中更新table,但我认为这是不好的做法,尤其是在使用远程数据库时,因为它会更改原始 table。所以我想说,如果您不确定自己在做什么,最好更新底层的 table 。
此外,如果您运行 较早版本的 postgresql 视图未更新table。
您可以将数据转换添加到视图定义中,而不是更新视图。
CREATE VIEW old_employee AS
SELECT studies.id,
(SELECT CASE
WHEN t1.gloves = 0 THEN 52
WHEN t1.gloves = 1 THEN 51
WHEN t1.gloves = 2 THEN 53
END) as gloves,
(SELECT CASE
WHEN t1.apron = 0 THEN 55
WHEN t1.apron = 1 THEN 54
WHEN t1.apron = 2 THEN 56
END) as apron,
(
SELECT CASE
WHEN t1.vocation = 1 THEN 35
WHEN t1.vocation = 2 THEN 37
WHEN t1.vocation = 3 THEN 43
WHEN t1.vocation = 4 THEN 45
END) as vocation
FROM studies INNER JOIN dblink('dbname=mydb', 'select study, gloves, apron, vocation from personnel')
AS t1(study char(10), gloves integer, apron integer, vocation integer)
ON studies.name_string = t1.study;
我想更改 table 上每一列的值。 这就是我得到的:
CREATE VIEW old_employee AS
SELECT *
FROM dblink('dbname=mydb', 'select study, gloves, apron, vocation from personnel')
AS t1(study char(10), gloves integer, apron integer, vocation integer);
SELECT * FROM old_employee;
study | gloves | apron | vocation
------------+------------------+------------+
STUDY1 | 1 | 1 | 1 |
STUDY2 | 2 | 2 | 2 |
STUDY3 | 0 | 2 | 3 |
STUDY3 | 1 | 0 | 4 |
我想要的输出
study | gloves | apron | vocation
------------+------------------+------------+
1 | 51 | 54 | 35 |
2 | 53 | 56 | 37 |
3 | 52 | 56 | 43 |
4 | 51 | 55 | 45 |
我的第一个想法是在更新时使用多个 CASE WHEN。类似于:
UPDATE old_employee
SET study = (
SELECT studies.id
FROM studies
INNER JOIN old_employee
ON studies.name_string = old_employee.study
),
gloves = (
SELECT CASE
WHEN gloves = 0 THEN 52
WHEN gloves = 1 THEN 51
WHEN gloves = 2 THEN 53
END
FROM old_employee
),
apron = (
SELECT CASE
WHEN apron = 0 THEN 55
WHEN apron = 1 THEN 54
WHEN apron = 2 THEN 56
END
FROM old_employee
),
vocation = (
SELECT CASE
WHEN vocation = 1 THEN 35
WHEN vocation = 2 THEN 37
WHEN vocation = 3 THEN 43
WHEN vocation = 4 THEN 45
END
FROM old_employee
);
显然这是行不通的,我想知道我是在正确地解决这个问题还是遗漏了什么。我是一名程序员,刚接触 SQL,所以我不太习惯 SQL 的心态。
虽然视图在 postgesql 9.3 中更新table,但我认为这是不好的做法,尤其是在使用远程数据库时,因为它会更改原始 table。所以我想说,如果您不确定自己在做什么,最好更新底层的 table 。
此外,如果您运行 较早版本的 postgresql 视图未更新table。
您可以将数据转换添加到视图定义中,而不是更新视图。
CREATE VIEW old_employee AS
SELECT studies.id,
(SELECT CASE
WHEN t1.gloves = 0 THEN 52
WHEN t1.gloves = 1 THEN 51
WHEN t1.gloves = 2 THEN 53
END) as gloves,
(SELECT CASE
WHEN t1.apron = 0 THEN 55
WHEN t1.apron = 1 THEN 54
WHEN t1.apron = 2 THEN 56
END) as apron,
(
SELECT CASE
WHEN t1.vocation = 1 THEN 35
WHEN t1.vocation = 2 THEN 37
WHEN t1.vocation = 3 THEN 43
WHEN t1.vocation = 4 THEN 45
END) as vocation
FROM studies INNER JOIN dblink('dbname=mydb', 'select study, gloves, apron, vocation from personnel')
AS t1(study char(10), gloves integer, apron integer, vocation integer)
ON studies.name_string = t1.study;