UN CASE
declaración puede ayudar. En este ejemplo:
- la
source
, sam, está en la posición 8 - el
target
, bob, está en la posición 2
Reemplazando las variables con los valores reales, la siguiente declaración desplaza todo hacia abajo 2 desde el origen, deja el entre miembros como está, establece el objetivo igual al origen, mueve el resto hacia abajo:
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)
Eso movería algo en la lista. Se podría aplicar una lógica similar para bajar en una lista. Y asume que los números negativos están bien y que solo el orden relativo es de interés.