Ett CASE
uttalande kan hjälpa. I det här exemplet:
-
source
, sam, är på position 8 -
target
, bob, är på position 2
Genom att ersätta variablerna med de faktiska värdena flyttar följande påstående allt ned 2 från källan, lämnar mellan medlemmarna som de är, sätter målet lika med källan, flyttar resten ner:
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 skulle flytta upp något på listan. Liknande logik skulle kunna användas för att flytta ner i en lista. Och det förutsätter att negativa tal är bra och att bara den relativa ordningen är av intresse.