Um
CASE
declaração pode ajudar. Neste exemplo:- a
source
, sam, está na posição 8 - o
target
, bob, está na posição 2
Substituindo as variáveis pelos valores reais, a instrução a seguir desloca tudo 2 para baixo da origem, deixa o entre os membros como está, define o destino igual à origem, move o resto para baixo:
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)
Isso moveria algo para cima na lista. Lógica semelhante pode ser aplicada para descer uma lista. E assume que números negativos são bons e que apenas a ordenação relativa é de interesse.