给定一个具有如下值的表:
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会导致任何问题吗?
答案 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)
这会把一些东西放在清单上。可以应用类似的逻辑来向下移动列表。它假设负数很好,只需要相对排序。