CASE
prohlášení může pomoci. V tomto příkladu:
source
, sam, je na pozici 8target
, bob, je na pozici 2
Následující příkaz nahradí proměnné skutečnými hodnotami a posune vše o 2 dolů od zdroje, ponechá mezi členy tak, jak jsou, nastaví cíl rovný zdroji a zbytek přesune dolů:
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 by posunulo něco výše v seznamu. Podobnou logiku lze použít pro pohyb v seznamu dolů. A předpokládá, že záporná čísla jsou v pořádku a že je zajímavé pouze relativní řazení.