UPDATE语句根据数字公式重新分配列值

时间:2014-04-27 22:36:18

标签: mysql sql

给定一个具有如下值的表:

name, sortval, dept

bob,   2,       1
tom,   4,       1
mary,  6,       1
sam,   8,       1
tim,  10,       1

sortvalue决定了我输出列表的顺序,所以

select name from table order by sortval ASC
看起来像这样:

bob
tom
mary
sam
tim

现在让我们说我希望sam在bob之后向上移动2行。我执行这个陈述:

UPDATE table set sortval=sortval-5 where name='sam'

现在表格如下:

name, sortval, dept

bob,   2,       1
tom,   4,       1
mary,  6,       1
sam,   3,       1
tim,  10,       1

这是问题......

我希望最简单的语句重新排序sortval值,使它们再一次,所有偶数以2开始递增2,按照sortval的顺序,所以它最终会像这样结束:

name, sortval, dept

bob,   2,       1
sam,   4,       1
tom,   6,       1
mary,  8,       1
tim,  10,       1

我认为有一种简单的方法可以使用某种复合UPDATE来重置上面的sortval值。

我只是在寻找一个非常具体的UPDATE语句,它可以按照sortval的顺序根据rownum * 2的简单公式重新分配sortval的值,并且想要知道在使用语句时是否混淆了sortval ORDER BY sortval会导致任何问题吗?

1 个答案:

答案 0 :(得分:0)

CASE声明可能有所帮助。在这个例子中:

  • source,sam,位于第8位
  • target,bob,位于第2位

使用实际值替换变量,以下语句将所有内容从源中移除2,将原始成员保留为原样,将目标设置为source,将其余部分向下移动:

postgres=> SELECT * FROM test order by sortval;
 name | sortval
------+---------
 bob  |       2
 tom  |       4
 mary |       6
 sam  |       8
 tim  |      10
(5 rows)


postgres=>      UPDATE test
postgres->        SET sortval = CASE WHEN sortval <= 2 THEN sortval - 2
postgres->                           WHEN sortval = 8  THEN 2
postgres->                           WHEN sortval >= 8 THEN sortval - 2
postgres->                           ELSE sortval
postgres->                           END;
UPDATE 5
postgres=> SELECT * FROM test order by sortval;
 name | sortval
------+---------
 bob  |       0
 sam  |       2
 tom  |       4
 mary |       6
 tim  |       8
(5 rows)

这会把一些东西放在清单上。可以应用类似的逻辑来向下移动列表。它假设负数很好,只需要相对排序。