En CASE
udtalelse kan hjælpe. I dette eksempel:
-
source
, sam, er i position 8 target
, bob, er i position 2
Ved at erstatte variablerne med de faktiske værdier, flytter følgende sætning alt ned 2 fra kilden, efterlader mellem medlemmer som de er, sætter målet lig med kilden, flytter resten ned:
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)
Det ville rykke noget op på listen. Lignende logik kunne anvendes til at flytte ned på en liste. Og det antager, at negative tal er fine, og at kun den relative rækkefølge er af interesse.