A CASE
изявлението може да помогне. В този пример:
source
, Сам, е на позиция 8target
, Bob, е на позиция 2
Заменяйки променливите с действителните стойности, следното изявление измества всичко надолу 2 от източника, оставя между членовете както е, задава целта равна на източника, премества останалото надолу:
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)
Това би преместило нещо нагоре в списъка. Подобна логика може да се приложи за придвижване надолу по списък. И предполага, че отрицателните числа са добре и че само относителната подредба представлява интерес.