基于 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;