обновить значения столбца другими значениями столбца в postgresql - PullRequest
0 голосов
/ 06 июля 2018

что у меня есть

id  s_1     s_2      s_3      s_4     s_5     s_6     s_7      s_8

 ax    1      0         0       0       0        0       0       0
 bx    0      1         0       0       0        0       0       0
 cx    0      0         1       0       0        0       0       0
 dx    0      0         0       1       0        0       0       0
 ex    0      0         0       0       1        0       0       0
 fx    0      0         0       0       0        1       0       0
 gx    0      0         0       0       0        0       1       0
 hx    0      0         0       0       0        0       0       1

Я пытаюсь обновить значения моего столбца, как показано ниже.

если у меня есть 1,0,0,0,0,0,0,0 в качестве значений столбца от s1 до s8, то его следует обновить как 1,0,1,0,1,0,1,0

если в качестве значений столбцов от s1 до s8 у меня есть 0,1,0,0,0,0,0,0, то его следует обновить как 0,1,1,0,1,0,1,0

если у меня есть 0,0,1,0,0,0,0,0 в качестве значений столбца от s1 до s8, то его следует обновить как 0,0,1,0,1,0,1,0

если у меня есть 0,0,0,1,0,0,0,0 в качестве значений столбца от s1 до s8, то его следует обновить как 0,0,0,1,1,0,1,0

если у меня есть 0,0,0,0,1,0,0,0 в качестве значений столбца от s1 до s8, то его следует обновить как 0,0,0,0,1,0,1,0

если в качестве значений столбцов от s1 до s8 у меня есть 0,0,0,0,0,1,0,0, то его следует обновить как 0,0,0,0,1,1,1,0

если у меня есть 0,0,0,0,0,0,1,0 в качестве значений столбца от s1 до s8, то его следует обновить как 0,0,0,0,0,0,1,0

если в качестве значений столбцов от s1 до s8 у меня есть 0,0,0,0,0,0,0,1, то его следует обновить как 0,0,0,0,0,0,0,1

Вывод выглядит как ниже

 id  s_1     s_2      s_3      s_4     s_5     s_6     s_7      s_8

 ax    1      0         1       0       1        0       1       0
 bx    0      1         1       0       1        0       1       0
 cx    0      0         1       0       1        0       1       0
 dx    0      0         0       1       1        0       1       0
 ex    0      0         0       0       1        0       1       0
 fx    0      0         0       0       1        1       1       0
 gx    0      0         0       0       0        0       1       0
 hx    0      0         0       0       0        0       0       1

Ответы [ 2 ]

0 голосов
/ 08 июля 2018
UPDATE table_name AS o
   SET (s_1, s_2, s_3, s_4, s_5, s_6, s_7, s_8) = (n_1, n_2, n_3, n_4, n_5, n_6, n_7, n_8) 
  FROM (
       VALUES 
         (1,0,0,0,0,0,0,0, 1,0,1,0,1,0,1,0),
         (0,1,0,0,0,0,0,0, 0,1,1,0,1,0,1,0), 
         (0,0,1,0,0,0,0,0, 0,0,1,0,1,0,1,0), 
         (0,0,0,1,0,0,0,0, 0,0,0,1,1,0,1,0), 
         (0,0,0,0,1,0,0,0, 0,0,0,0,1,0,1,0),
         (0,0,0,0,0,1,0,0, 0,0,0,0,1,1,1,0),
         (0,0,0,0,0,0,1,0, 0,0,0,0,0,0,1,0),
         (0,0,0,0,0,0,0,1, 0,0,0,0,0,0,0,1)
       ) as n (
         s_1, s_2, s_3, s_4, s_5, s_6, s_7, s_8,
         n_1, n_2, n_3, n_4, n_5, n_6, n_7, n_8
       ) 
 WHERE (o.s_1, o.s_2, o.s_3, o.s_4, o.s_5, o.s_6, o.s_7, o.s_8) = (n.s_1, n.s_2, n.s_3, n.s_4, n.s_5, n.s_6, n.s_7, n.s_8)
0 голосов
/ 06 июля 2018

Я уверен, что существует единственное решение для обновления SQL, но следующее многократное утверждение гораздо проще написать (и отладить):

update my_table -- case 1: 1,0,0,0,0,0,0,0
  set s1 = 1, s2 = 0, s3 = 1, s4 = 0, s5 = 1, s6 = 0, s7 = 1, s8 = 0
  where s1 = 1 and s2 = 0 and s3 = 0 and s4 = 0 
    and s5 = 0 and s6 = 0 and s7 = 0 and s8 = 0;

Тогда для случая 2:

update my_table -- case 2: 0,1,0,0,0,0,0,0
  set s1 = 0, s2 = 1, s3 = 1, s4 = 0, s5 = 1, s6 = 0, s7 = 1, s8 = 0
  where s1 = 0 and s2 = 1 and s3 = 0 and s4 = 0 
    and s5 = 0 and s6 = 0 and s7 = 0 and s8 = 0;

Вы можете написать остальные случаи (3, 4, 5, 6, 7 и 8).

...