CASE
oświadczenie może pomóc. W tym przykładzie:
source
, sam, jest na pozycji 8target
, bob, jest na pozycji 2
Zastępując zmienne rzeczywistymi wartościami, następująca instrukcja przesuwa wszystko w dół o 2 od źródła, pozostawia między elementami bez zmian, ustawia cel równy źródłu, przesuwa resztę w dół:
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)
To przeniosłoby coś na górę listy. Podobną logikę można zastosować do przesuwania listy w dół. Zakłada, że liczby ujemne są w porządku, a interesująca jest tylko kolejność względna.